QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。QDockWidget可以移动、悬浮,在许多工程软件中,都是使用dock布局窗口,用户可以自由组合窗口界面。
dock布局讲解
新建QMainWindow基类工程,在ui设计页面拖入7个QDockWidget控件。
因为整个窗口都由dock组成,所以在myMainWindow的构造函数中先把QMainWindow的中间窗口部件去除。
QWidget* central_form = takeCentralWidget();
if(central_form)
delete central_form;
用setWindowTitle(const QString &)函数为每个dock添加标题便于后面区分。
ui->dockWidget_1->setWindowTitle("dock1");
接下来配置
setDockNestingEnabled(true);
这句语句是用来配置dock是否可以嵌套。通过查询帮助文档,我们可以知道,如果参数为false,则停靠区域只能水平或者垂直,即dock不能放置在中间,只能在两侧排布。如果参数为true,那么dock所占用的区域可以向任意方向排布。
接下来先移除所有的dock,我们来调整dock位置。调整dock位置前通过
addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_1);
为第一个dock指定位置,接下来通过配置
void QMainWindow::splitDockWidget(QDockWidget *first, QDockWidget *second, Qt::Orientation orientation)
的参数对所有的dock进行排列,这个函数是将第一个停靠dock覆盖的空间分成两部分,将第一个停靠dock移动到第一部分中,并将第二个停靠dock移动到第二部分中。通过这样的方式可以先左右,再上下的原则依次对dock进行排列。例如:
- Qt::Horizontal:将第二个dock置于第一个dock的右侧。
- Qt::Vertical:将第二个停靠dock放在第一个停靠dock的下面。
此时编译运行,
其它功能函数介绍
接下来,介绍几个常用的QDockWidget控件配置函数:
ui->dockWidget_3->setMinimumWidth(150); ui->dockWidget_5->setMinimumHeight(100); ui->dockWidget_1->setMaximumSize(100,100);
- 配置dock最小的宽度、高度,最大尺寸。
QWidget* TitleBar = ui->dockWidget_2->titleBarWidget(); QWidget* EmptyWidget = new QWidget(); ui->dockWidget_2->setTitleBarWidget(EmptyWidget); delete TitleBar;
- 隐藏标题栏。
tabifyDockWidget(ui->dockWidget_4,ui->dockWidget_5);
- 合并窗口,采用
void QMainWindow::tabifyDockWidget(QDockWidget *first, QDockWidget *second)
函数,将多个QDockWidget叠加到同一区域。
ui->dockWidget_4->setFeatures(QDockWidget::DockWidgetFloatable);
-通过
void setFeatures(DockWidgetFeatures features)
配置dock是否可关闭、漂浮、拖动等属性,它的参数有:
常量 描述 QDockWidget::DockWidgetClosable 可关闭 QDockWidget::DockWidgetMovable 可移动 QDockWidget::DockWidgetFloatable 可漂浮 QDockWidget::DockWidgetVerticalTitleBar 在左边显示垂直的标签栏 QDockWidget::AllDockWidgetFeatures 具有1,2,3的所有功能 QDockWidget::NoDockWidgetFeatures 无法关闭,不能移动,不能漂浮
代码
.h文件代码
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include "quiwidget.h"
namespace Ui {
class myMainWindow;
}
class myMainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit myMainWindow(QWidget *parent = 0);
~myMainWindow();
void RemoveAllDock();
void showDock(const QList<int> &index= QList<int>());
private:
Ui::myMainWindow *ui;
QList<QDockWidget*> dock_points;
};
#endif // MYMAINWINDOW_H
.cpp文件代码
#include "mymainwindow.h"
#include "ui_mymainwindow.h"
myMainWindow::myMainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::myMainWindow)
{
ui->setupUi(this);
QWidget* central_form = takeCentralWidget();
if(central_form)
delete central_form;
ui->dockWidget_1->setWindowTitle("dock1");
ui->dockWidget_2->setWindowTitle("dock2");
ui->dockWidget_3->setWindowTitle("dock3");
ui->dockWidget_4->setWindowTitle("dock4");
ui->dockWidget_5->setWindowTitle("dock5");
ui->dockWidget_6->setWindowTitle("dock6");
ui->dockWidget_7->setWindowTitle("dock7");
setDockNestingEnabled(true);
dock_points.append(ui->dockWidget_1);
dock_points.append(ui->dockWidget_2);
dock_points.append(ui->dockWidget_3);
dock_points.append(ui->dockWidget_4);
dock_points.append(ui->dockWidget_5);
dock_points.append(ui->dockWidget_6);
dock_points.append(ui->dockWidget_7);
RemoveAllDock();
addDockWidget(Qt::TopDockWidgetArea,ui->dockWidget_1);
addDockWidget(Qt::LeftDockWidgetArea,ui->dockWidget_2);
splitDockWidget(ui->dockWidget_2,ui->dockWidget_3,Qt::Horizontal);
splitDockWidget(ui->dockWidget_2,ui->dockWidget_4,Qt::Vertical);
splitDockWidget(ui->dockWidget_3,ui->dockWidget_6,Qt::Horizontal);
splitDockWidget(ui->dockWidget_6,ui->dockWidget_7,Qt::Vertical);
tabifyDockWidget(ui->dockWidget_4,ui->dockWidget_5);
showDock(QList<int>()<< 0<<1<<2<<3<<4<<5<<6);
}
void myMainWindow::RemoveAllDock()
{
for(int i=0;i<7;i++){
removeDockWidget(dock_points[i]);
}
}
void myMainWindow::showDock(const QList<int> &index)
{
if (index.isEmpty()){
for(int i=0;i<7;++i){
dock_points[i]->show();
}
}
else{
foreach (int i, index) {
dock_points[i]->show();
}
}
}
myMainWindow::~myMainWindow()
{
delete ui;
}