1.前言
顶层浮动窗口在很多软件中都有应用,比如ps。
使用浮动窗口灵活、方便、操作性较强、每个从主窗体拖拽出的窗体都可以看做一个单独的窗体,可分屏操作。
Qt也有自带的顶层浮动窗口,如
QDockWidget
,可设置窗口特性、窗口浮动等。
使用如下:
QTextBrowser* pTB = new QTextBrowser(this);
QDockWidget* pDW_navigation = new QDockWidget("导航区");
pDW_navigation->setAllowedAreas(Qt::LeftDockWidgetArea);
QDockWidget* pDW_attri = new QDockWidget("属性区");
QDockWidget* pDW_hint = new QDockWidget("消息区");
addDockWidget(Qt::LeftDockWidgetArea, pDW_navigation);
addDockWidget(Qt::LeftDockWidgetArea, pDW_attri);
addDockWidget(Qt::BottomDockWidgetArea, pDW_hint);
setCentralWidget(pTB);
Qt Designer也使用了该框架,如下:
2.Qt-Advanced-Docking-System
Qt-Advanced-Docking-System
是一个类似于QDockWidget
的库,功能比QDockWidget
丰富,有很好的交互,很多成熟的软件都有它的影子。
2.1项目地址
项目地址:https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System
2.2使用
有两种使用方式:1.直接使用源码;2.编译成库使用。 编译库调用代码,需要有该库的头文件及lib库(供参考):
#第三方库加载
LIBS += -L$${库路径} -lqtadvanceddocking
# 引用头文件
INCLUDEPATH += $$PWD/路径/QtDock/
DEPENDPATH += $$PWD/路径/QtDock/
使用代码如下:
ads::CDockManager* pDockManager = new ads::CDockManager();
// 设置dock管理
setCentralWidget(pDockManager);
ads::CDockWidget* pDockgzq = new ads::CDockWidget("工作区");
ads::CDockWidget* pDockdh = new ads::CDockWidget("导航区");
ads::CDockWidget* pDocksc = new ads::CDockWidget("输出");
// 工作区
pDockManager->setCentralWidget(new QWidget());
// 不能移动,不能关闭,不能悬浮
pDockgzq->setFeature(ads::CDockWidget::DockWidgetMovable, true);
pDockgzq->setFeature(ads::CDockWidget::DockWidgetClosable, true);
pDockgzq->setFeature(ads::CDockWidget::DockWidgetFloatable, true);
// 设置控件
pDockdh->setWidget(new QWidget());
pDockManager->addDockWidget(ads::LeftDockWidgetArea, pDockdh);
pDocksc->setWidget(new QWidget());
QAction* pActClear = new QAction(QIcon(""), "动作", this);
pDocksc->setTitleBarActions(QList<QAction*>() << pActClear);
pDockManager->addDockWidget(ads::BottomDockWidgetArea, pDocksc, pDockdh->dockAreaWidget());
// 设置伸缩尺寸,必须放到addDockWidget()操作后,不然不生效
pDockManager->setSplitterSizes(pDockgzq->dockAreaWidget(), QList<int>() << 100 << 150);
// 设置视图
QMap<QString, ads::CDockWidget*> mapDockAct = pDockManager->dockWidgetsMap();
for(auto itor = mapDockAct.begin(); itor != mapDockAct.end(); itor++)
{
menu->addAction((itor.value())->toggleViewAction());
}