今天小豆君来分享下Qt的停靠窗口QDockWidget。
QDockWidget可以停靠在QMainWindow内,或者作为桌面的顶层窗口。
QDockWidget一般会作为工具面板或实用工具窗口。比较类似与我们vs中的查找替换窗口
QDockWidget由标题栏和内容区域组成。标题栏显示窗口标题、浮动按钮和关闭按钮。
4.5.1 属性
QDockWidget继承于QWidget。
1 allowedAreas 规定了悬停窗口可以被放置在哪些区域
Qt::LeftDockWidgetArea 可停靠在左侧
Qt::RightDockWidgetArea 可停靠在右侧
Qt::TopDockWidgetArea 可停靠在上侧
Qt::BottomDockWidgetArea 可停靠在下侧
Qt::AllDockWidgetAreas 可停靠在上下左右
Qt::NoDockWidgetArea 不可停靠
这个属性是QFlags<DockWidgetArea>的,也就是说彼此之间可以使用或运算符(|),取并集。
2 features 窗口标识
QDockWidget::DockWidgetClosable 可以关闭停靠窗口
QDockWidget::DockWidgetMovable 可以移动停靠窗口
QDockWidget::DockWidgetFloatable 停靠窗口可以跟主窗口分离,变成一个浮动窗口
QDockWidget::DockWidgetVerticalTitleBar 当停靠窗口在左侧时,标题可以垂直排列
QDockWidget::AllDockWidgetFeatures 可关闭,移动和浮动
QDockWidget::NoDockWidgetFeatures 不可关闭,移动和浮动
这个属性也是QFlags<DockWidgetFeature>的。
3 floating 是否处于浮动状态
为true时,其作为独立的窗口呈现给用户,而不是被停靠在QMainWindow上。
4 windowTitle 窗口标题
4.5.2 常用函数
- setTitleBarWidget(QWidget* widget)
为停靠窗口设置自定义标题栏。
- setWidget(QWidget* widget)
为停靠窗口设置自定义的内容区域。
4.5.3 示例
新建项目MainWindowDock,类名MainWindowDock,继承于QMainWindow
在ui界面拖入四个QDockWidget,并分别命名为上侧,下侧,左侧,右侧。
在中心窗口区域拖入一个QTabWidget,第一页标题为allowedAreas,并在里面拖入一个QListWidget,并新增四个item。同理编辑第二页features,如图二。
mainwindow.h
#ifndef MAINWINDOWDOCK_H #define MAINWINDOWDOCK_H #include <QMainWindow> namespace Ui { class MainWindowDock; } class QListWidgetItem; class MainWindowDock : public QMainWindow { Q_OBJECT public: explicit MainWindowDock(QWidget *parent = 0); ~MainWindowDock(); private slots: void on_listWidget_areas_itemChanged(QListWidgetItem *item); void on_listWidget_features_itemChanged(QListWidgetItem *item); private: Ui::MainWindowDock *ui; }; #endif // MAINWINDOWDOCK_H
mainwindow.cpp
#include "mainwindowdock.h" #include "ui_mainwindowdock.h" MainWindowDock::MainWindowDock(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindowDock) { ui->setupUi(this); } MainWindowDock::~MainWindowDock() { delete ui; } void MainWindowDock::on_listWidget_areas_itemChanged(QListWidgetItem *item) { //获取该item所代表的位置flag int row = ui->listWidget_areas->row(item); int flg = Qt::LeftDockWidgetArea << row; //获取停靠窗口原来的位置flag,并设置新的可放置区域 QList<QDockWidget *> allDocks = findChildren<QDockWidget *>(); foreach (QDockWidget* dock, allDocks) { Qt::DockWidgetAreas areas = dock->allowedAreas(); areas.setFlag((Qt::DockWidgetArea)flg, item->checkState() == Qt::Checked); dock->setAllowedAreas(areas); } } void MainWindowDock::on_listWidget_features_itemChanged(QListWidgetItem *item) { //获取该item所代表的停靠窗口标识 int row = ui->listWidget_features->row(item); int flg = QDockWidget::DockWidgetClosable << row; //获取停靠窗口原来的窗口flag,并设置新的标识 QList<QDockWidget *> allDocks = findChildren<QDockWidget *>(); foreach (QDockWidget* dock, allDocks) { QDockWidget::DockWidgetFeatures features = dock->features(); features.setFlag((QDockWidget::DockWidgetFeature)flg, item->checkState() == Qt::Checked); dock->setFeatures(features); } }
现在我们来编译运行程序,并且勾选不同的属性,拖拽移动停靠窗口,看看都有哪些变化。
下图展示停靠窗口位于左侧并且标题垂直排列
下图展示左侧和右侧停靠窗口重叠在一起,上下侧窗口悬浮。
好的,今天的分享就到这里啦,我们下期再见。
如果你想要获得更多编程干货,请关注我的微信公众号:小豆君,只要关注,便可加入小豆君为大家创建的C++\Qt交流群,方便讨论学习。