1. 概述
- QDockWidget 是 Qt 中用于创建可停靠窗口的组件,通常依附于主窗口(
QMainWindow
)的四周(上下左右),用户可拖动、浮动或调整其位置。 - 适用于需要灵活布局的场景(如 IDE 中的工具窗口、属性面板等)。
2. 主要特性
- 可停靠性:可拖拽到主窗口的任意允许区域(
Qt::DockWidgetArea
)。 - 浮动支持:可脱离主窗口成为独立窗口(浮动模式)。
- 动态布局:用户可自定义布局,布局信息可通过
QMainWindow::saveState()
保存。 - 内容自定义:通过
setWidget()
设置内容部件。
3. 常用方法
方法 | 说明 |
---|
setWidget(QWidget *) | 设置 DockWidget 的内容部件 |
setWindowTitle(const QString &) | 设置 DockWidget 的标题 |
setAllowedAreas(Qt::DockWidgetAreas) | 设置允许停靠的区域(默认所有区域) |
setFeatures(QDockWidget::DockWidgetFeatures) | 设置 DockWidget 的功能(如是否可关闭、浮动等) |
setFloating(bool) | 设置是否浮动 |
isFloating() const | 判断是否处于浮动状态 |
toggleViewAction() | 获取控制 DockWidget 显示/隐藏的 QAction |
4. 信号与槽
信号 | 说明 |
---|
dockLocationChanged(Qt::DockWidgetArea) | 停靠区域变化时触发 |
topLevelChanged(bool) | 浮动状态变化时触发(true 表示浮动) |
visibilityChanged(bool) | 可见性变化时触发 |
5. 使用步骤
- 创建主窗口:需基于
QMainWindow
(DockWidget 依附于主窗口)。 - 创建 DockWidget:实例化
QDockWidget
并设置内容部件。 - 添加到主窗口:通过
QMainWindow::addDockWidget()
添加。 - 设置属性:如允许停靠的区域、是否可关闭等。
- 处理信号(可选):如响应浮动状态变化。
6. 示例代码
#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>
class MainWindow : public QMainWindow {
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
QTextEdit *centralWidget = new QTextEdit(this);
setCentralWidget(centralWidget);
QDockWidget *dock = new QDockWidget("工具窗口", this);
QTextEdit *dockContent = new QTextEdit(dock);
dock->setWidget(dockContent);
dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
dock->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
addDockWidget(Qt::LeftDockWidgetArea, dock);
}
};
7. 注意事项
- 内存管理:确保 DockWidget 或其内容部件的父对象正确,避免内存泄漏。
- 主窗口依赖:必须有一个
QMainWindow
作为主窗口,且需设置中心部件(setCentralWidget()
)。 - 布局冲突:多个 DockWidget 可能互相遮挡,需合理设置停靠顺序或使用
tabifyDockWidget()
合并标签页。 - 样式调整:浮动时的窗口样式可能与主窗口不同,需注意跨平台一致性。
- 平台差异:某些操作系统对浮动窗口的行为可能有特殊限制。