一、描述
QDockWidget提供了dock widget的概念,也称为工具面板或实用工具窗口。停靠窗口是放置在QMainWindow中央小部件周围的停靠小部件区域中的次要窗口。如图所示:
标记处即为dockwidget可停靠位置,在QT中这部分的设置是用一个枚举来实现的,如图
可访问这些枚举的函数为:
其中
void setAllowedAreas(Qt::DockWidgetAreas areas) 可以设置dockwidget可停靠的位置,如果不设置,那么默认是上下左右都可停靠的
举例设置停靠位置为左右时
QDockWidget *dock = new QDockWidget(tr("Customers"), this);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
而Qt::DockWidgetAreas allowedAreas() const 函数是返回窗口可停靠区域的,返回值是枚举类型,这个函数一般用不到
下面还有一个信号,这个信号是在allowedAreas属性改变时发出的。allowedAreas参数给出了属性的新值。
关于QDockWidget还有另外一个枚举,是设置dockwidget的窗口属性的
QDockWidget::DockWidgetClosable 0x01 可关闭
QDockWidget::DockWidgetMovable 0x02 dock小部件可以由用户在dock之间移动。
QDockWidget::DockWidgetFloatable 0x04 可以将dock小部件与主窗口分离,并作为独立窗口浮动。
QDockWidget::DockWidgetVerticalTitleBar 0x08 dock小部件在左侧显示一个垂直的标题栏
QDockWidget::AllDockWidgetFeatures DockWidgetClosable|DockWidgetMovable|DockWidgetFloatable 前三个的集合
QDockWidget::NoDockWidgetFeatures 0x00 无法关闭、移动或浮动dock小部件。
关于这个特征QT也给出了相关函数的设置, 比如
void setFeatures(QDockWidget::DockWidgetFeatures features) 可以设置窗口特征,默认值是AllDockWidgetFeatures
QDockWidget::DockWidgetFeatures features() const用获取窗口部件的特征
void featuresChanged(QDockWidget::DockWidgetFeatures features)此信号在特性属性更改时发出。
二、使用
主要使用这个函数
void QDockWidget::setWidget(QWidget *widget)
在DockWidget中添加一个控件,这里用一个Label显示
1.实例化一个dock对象和Label对象
QDockWidget *dock = new QDockWidget(tr("New Dock"), this);
QLabel *label_1 = new QLabel(dock);
label_1->setText("向dock中添加一个控件");
2.将控件label添加到dock中
dock->setWidget(label_1);
3.设置dock的特征属性
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
this->addDockWidget(Qt::LeftDockWidgetArea, dock); /* 初始化显示在窗口左侧 */
ok 看下效果
在DockWdiget中添加多个控件
这里添加三个按钮,需要注意的是当添加多个控件时,需要一个Widget作为载体,
官方文档上有说明
Note that you must add the layout of the widget before you call this function; if not, the widget will not be visible.
我们需要将部件添加布局才能显示出来
1.实例化对象
QDockWidget *dock = new QDockWidget(tr("New Dock"), this);
QWidget *m_widget = new QWidget(dock);
QHBoxLayout *hBoxLayout_1 = new QHBoxLayout(m_widget);
QPushButton *button_1 = new QPushButton();
QPushButton *button_2 = new QPushButton();
QPushButton *button_3 = new QPushButton();
button_1->setText("start");
button_2->setText("stop");
button_3->setText("pause");
2.添加布局
hBoxLayout_1->addWidget(button_1);
hBoxLayout_1->addWidget(button_2);
hBoxLayout_1->addWidget(button_3);
dock->setWidget(m_widget);
3.属性设置
dock->setFeatures(QDockWidget::AllDockWidgetFeatures);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
addDockWidget(Qt::TopDockWidgetArea, dock); /* 初始化显示在窗口顶端 */
ok, 看下效果
使用QLIstWidget添加文本
QListWidget *customerList;
QDockWidget *dock = new QDockWidget(tr("Customers"), this);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
customerList = new QListWidget(dock);
customerList->addItems(QStringList()
<< "John Doe, Harmony Enterprises, 12 Lakeside, Ambleton"
<< "Jane Doe, Memorabilia, 23 Watersedge, Beaton"
<< "Tammy Shea, Tiblanka, 38 Sea Views, Carlton"
<< "Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal"
<< "Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston"
<< "Sally Hobart, Tiroli Tea, 67 Long River, Fedula");
dock->setWidget(customerList);
addDockWidget(Qt::RightDockWidgetArea, dock);
效果
三、其他
关于QDockWidget还有一些函数
比如 void setTitleBarWidget(QWidget *widget)
QAction *toggleViewAction() const
这里先介绍一下QAction *toggleViewAction() const,这个函数的返回值是一个QAction类,它可以显示的来开启和关闭dcokwidget,它的名称就是dockwidget窗口的标题
首先创建一个菜单栏
QMenu *fileMenu = menuBar()
QMenu *viewMenu;
viewMenu = menuBar()->addMenu(tr("&View"));
在viewMenu中添加动作
viewMenu->addAction(dock->toggleViewAction());
这样就可以了,可以看下效果,这样就可以通过点击按钮进行控制dock窗口的显示与关闭了
另一种方法是你可以先在UI设计师里面手动创建QAction,然后通过`toggled(bool)`信号来绑定QDockerWidget的`setHidden(bool)`函数,也可以实现相同的效果,代码如下:
ui->actionItem->setCheckable(true);
ui->actionProperty->setCheckable(true);
ui->actionItem->setChecked(true);
ui->actionProperty->setChecked(true);
connect(ui->actionItem, &QAction::toggled, ui->dockWidget, [=](bool state){
ui->dockWidget->setHidden(!state);
});
connect(ui->actionProperty, &QAction::toggled, ui->dockWidget_4, [=](bool state){
ui->dockWidget_4->setHidden(!state);
});
connect(ui->dockWidget, &QDockWidget::visibilityChanged, ui->actionItem, &QAction::setChecked);
connect(ui->dockWidget_4, &QDockWidget::visibilityChanged, ui->actionProperty, &QAction::setChecked);