Qt之QDockWidget嵌套布局详解-实现Visual Studio布局
许多工程软件,如Qt Creator,VS,matlab等,都是使用dock布局窗口,这样用户可以自定义界面,自由组合窗口。
Qt的嵌套布局由QDockWidget完成,用Qt Creator拖界面得到的dock布置形式比较固定,不能得想要的任意组合形式,要得到如下图所示的效果,后续布局必须通过代码来完成。
下面说说如何实现完全自由的界面布局效果:
QDockWidget在QMainWindow的布局函数
要在QMainWindow里对dock进行布局,需要用到如下几个函数:
- 添加dock函数
此函数用于给dock指定位置,同时也可以更改dock的位置,此函数命名为addDockWidget有点容易误导,因为不仅仅有add的功能,还有chang的功能
-
void
QMainWindow
::addDockWidget(Qt
::DockWidgetArea
area,
QDockWidget *
dockwidget)
-
void
QMainWindow
::addDockWidget(Qt
::DockWidgetArea
area,
QDockWidget *
dockwidget,
Qt
::Orientation
orientation)
- splitDockWidget 分割dock窗口函数
此函数的功能是把两个dock进行左右或上下并排布置,做成一个类似QSplit的功能
void QMainWindow::splitDockWidget(QDockWidget * first, QDockWidget * second, Qt::Orientation orientation)
- tabifyDockWidget tab化窗口函数
此函数的功能是把多个dock变成一个tab形式的窗体
void QMainWindow::tabifyDockWidget(QDockWidget * first, QDockWidget * second)
- 设置dock嵌套布局
此函数是设置嵌套布局的关键
void QMainWindow::setDockNestingEnabled(bool enabled)
以上几个函数就能完成比较复杂的嵌套布局了。
设置嵌套布局
下面通过例子来讲解如何设置复杂的嵌套布局
先用Qt Creator拖放9个dock进视图里,为了好区分,给每个dock设置一个背景颜色:
dock属性随便设置,保证都任意区域可以停靠即可
由于这里不需要MainWindow的中间窗口,整个视图都由dock组成,因此先把QMainWindow的中间窗口部件去除:
在MainWindow的构造函数加入如下语句,即可把MainWindow的中间窗口去除,这时整个MainWindow只有Dock组成
-
QWidget* p = takeCentralWidget();
-
if(p)
-
delete p;
编译出来的效果如图所示:
拖动dock可以发现,只能在两边进行组合,我想把dock放置到中间是无法实现的,这是由于为了简化dock的吸附,QMainWindow默认是把dock嵌套关闭的,需要我们手动设置,在MainWindow的构造函数里添加:
setDockNestingEnabled(true);
即可打开嵌套功能,这时编译出来的窗口能实现如下嵌套:
此时,整个窗口的布局将变得非常灵活且复杂,由于Qt Creator在ui编辑器中无法像编译出来的程序那样任意调整位置,因此需要手动对窗口进行设置。下面将介绍如何用代码设置复杂的dock
为了方便,添加两个函数和一个成员变量:
head:
-
public:
-
//移除并隐藏所有dock
-
void removeAllDock();
-
//显示dock窗口
-
void showDock(const QList<int>& index = QList<int>());
-
private:
-
QList<QDockWidget*> m_docks;
///< 记录所有dockWidget的指针
CPP:
-
MainWindow::MainWindow(QWidget *parent) :
-
QMainWindow(parent),
-
ui(
new Ui::MainWindow)
-