今天小豆君来分享下 Qt 的停靠窗口 QDockWidget.
QDockWidget 可以停靠在 QMainWindow 内, 或者作为桌面的顶层窗口.
QDockWidget 一般会作为工具面板或实用工具窗口. 比较类似与我们 vs 中的查找替换窗口.
image
QDockWidget 由标题栏和内容区域组成. 标题栏显示窗口标题, 浮动按钮和关闭按钮.
4.5.1 属性
QDockWidget 继承于 QWidget.
image
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, 如图二.
image
image
- 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);
- }
- }
现在我们来编译运行程序, 并且勾选不同的属性, 拖拽移动停靠窗口, 看看都有哪些变化.
下图展示停靠窗口位于左侧并且标题垂直排列
image
下图展示左侧和右侧停靠窗口重叠在一起, 上下侧窗口悬浮.
image
来源: http://www.jianshu.com/p/c7bd7f42f6fb