QDockWidget Class
QDockWidget 类提供了一种小部件,该小部件既可以停靠在QMainWindow 内,也可以作为顶级窗口浮动在桌面上。更多内容...
| 标题: | #include <QDockWidget> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 继承自: | QWidget |
公共类型
| enum | DockWidgetFeature { DockWidgetClosable, DockWidgetMovable, DockWidgetFloatable, DockWidgetVerticalTitleBar, NoDockWidgetFeatures } |
| flags | DockWidgetFeatures |
属性
|
|
公共函数
| QDockWidget(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()) | |
| QDockWidget(const QString &title, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()) | |
| virtual | ~QDockWidget() |
| Qt::DockWidgetAreas | allowedAreas() const |
| Qt::DockWidgetArea | dockLocation() const |
| QDockWidget::DockWidgetFeatures | features() const |
| bool | isAreaAllowed(Qt::DockWidgetArea area) const |
| bool | isFloating() const |
| void | setAllowedAreas(Qt::DockWidgetAreas areas) |
(since 6.9) void | setDockLocation(Qt::DockWidgetArea area) |
| void | setFeatures(QDockWidget::DockWidgetFeatures features) |
| void | setFloating(bool floating) |
| void | setTitleBarWidget(QWidget *widget) |
| void | setWidget(QWidget *widget) |
| QWidget * | titleBarWidget() const |
| QAction * | toggleViewAction() const |
| QWidget * | widget() const |
信号
| void | allowedAreasChanged(Qt::DockWidgetAreas allowedAreas) |
| void | dockLocationChanged(Qt::DockWidgetArea area) |
| void | featuresChanged(QDockWidget::DockWidgetFeatures features) |
| void | topLevelChanged(bool topLevel) |
| void | visibilityChanged(bool visible) |
受保护函数
| virtual void | initStyleOption(QStyleOptionDockWidget *option) const |
重新实现的受保护函数
| virtual void | changeEvent(QEvent *event) override |
| virtual void | closeEvent(QCloseEvent *event) override |
| virtual bool | event(QEvent *event) override |
| virtual void | paintEvent(QPaintEvent *event) override |
详细说明
QDockWidget 提供了停靠小部件的概念,也称为工具面板或实用窗口。停靠窗口是放置在QMainWindow 中central widget 周围的停靠小部件区域内的次要窗口。
最终用户可以在其当前区域内移动停靠窗口,将其移动到新区域,或将其浮动(例如,从停靠区中解脱)。QDockWidget API 允许程序员限制停靠控件的移动、浮动和关闭能力,以及它们可以放置的区域。
外观
一个 QDockWidget 由标题栏和内容区域组成。标题栏显示停靠小部件的window title 、浮动按钮和关闭按钮。根据 QDockWidget 的状态,浮动按钮和关闭按钮可能会被禁用,或者根本不显示。
标题栏和按钮的外观取决于所使用的style 。
QDockWidget 作为其子控件的包装器,该子控件通过setWidget() 设置。自定义尺寸提示、最小和最大尺寸以及尺寸策略应在子控件中实现。QDockWidget 将遵循这些设置,并调整自身的约束以包含边框和标题栏。 不应在 QDockWidget 本身上设置尺寸约束,因为这些约束会根据其是否已停靠而变化;已停靠的 QDockWidget 没有边框,且标题栏较小。
注意:在 macOS上 ,如果 QDockWidget 具有原生窗口句柄(例如,对其或子控件调用了winId()),则由于系统限制,在解除停靠时将无法拖动该停靠控件。 开始拖动会使停靠小部件脱离停靠,但需要进行第二次拖动才能移动停靠小部件本身。
另请参阅 QMainWindow 。
成员类型文档
enum QDockWidget::DockWidgetFeature
flags QDockWidget::DockWidgetFeatures
| 常数 | 值 | 描述 |
|---|---|---|
QDockWidget::DockWidgetClosable | 0x01 | 该停靠小部件可以关闭。 |
QDockWidget::DockWidgetMovable | 0x02 | 用户可以在不同的停靠栏之间移动该停靠小部件。 |
QDockWidget::DockWidgetFloatable | 0x04 | 该停靠小部件可以从主窗口中分离,并作为独立窗口浮动显示。 |
QDockWidget::DockWidgetVerticalTitleBar | 0x08 | 停靠控件在其左侧显示一条垂直标题栏。这可用于增加QMainWindow 中的垂直空间。 |
QDockWidget::NoDockWidgetFeatures | 0x00 | Dock 控件无法关闭、移动或浮动。 |
DockWidgetFeatures 类型是QFlags<DockWidgetFeature> 的 typedef。它存储 DockWidgetFeature 值的或(OR)组合。
属性文档
allowedAreas : Qt::DockWidgetAreas
可放置“dock”小部件的区域
默认位置为Qt::AllDockWidgetAreas 。
访问函数:
| Qt::DockWidgetAreas | allowedAreas() const |
| void | setAllowedAreas(Qt::DockWidgetAreas areas) |
通知器信号:
| void | allowedAreasChanged(Qt::DockWidgetAreas allowedAreas) |
另请参阅 Qt::DockWidgetArea 。
[since 6.9] dockLocation : Qt::DockWidgetArea
该属性保存当前的停靠位置,如果该停靠小部件处于浮动状态或没有主窗口父窗口,则该属性值为 Qt::NoDockLocation。
该枚举类型在 Qt 6.9 中引入。
访问函数:
| Qt::DockWidgetArea | dockLocation() const |
| void | setDockLocation(Qt::DockWidgetArea area) |
通知器信号:
| void | dockLocationChanged(Qt::DockWidgetArea area) |
features : DockWidgetFeatures
该属性用于指定停靠控件是否可移动、可关闭以及可悬浮
默认情况下,该属性被设置为DockWidgetClosable 、DockWidgetMovable 和DockWidgetFloatable 的组合。
访问函数:
| QDockWidget::DockWidgetFeatures | features() const |
| void | setFeatures(QDockWidget::DockWidgetFeatures features) |
通知器信号:
| void | featuresChanged(QDockWidget::DockWidgetFeatures features) |
另请参阅 DockWidgetFeature 。
floating : bool
该属性用于指定停靠控件是否为浮动状态
浮动式停靠控件会以单个独立窗口的形式“置于”其父控件QMainWindow 之上,向用户展示,而不是停靠在QMainWindow 中,或停靠在一组带标签页的停靠控件中。
浮动式Dock控件可通过编程或鼠标交互进行单独定位和调整大小。
默认情况下,此属性为true 。
当此属性发生变化时,会发出topLevelChanged() 信号。
访问函数:
| bool | isFloating() const |
| void | setFloating(bool floating) |
通知信号:
| void | topLevelChanged(bool topLevel) |
另请参见 isWindow() 和topLevelChanged()。
windowTitle : QString
该属性存储停靠控件的标题(标题)
默认情况下,该属性包含一个空字符串。
访问函数:
| QString | windowTitle() const |
| void | setWindowTitle(const QString &) |
通知器信号:
| void | windowTitleChanged(const QString &title) |
成员函数文档
[explicit] QDockWidget::QDockWidget(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
创建一个 QDockWidget,其父窗口为parent ,窗口标志为flags 。该停靠控件将被放置在左侧的停靠区域中。
[explicit] QDockWidget::QDockWidget(const QString &title, QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags())
创建一个父窗口为parent 、窗口标志为flags 的QDockWidget。该停靠控件将被放置在左侧停靠区域中。
窗口标题设置为title 。该标题在 QDockWidget 停靠和解停靠时均会使用,同时也会用于QMainWindow 提供的上下文菜单中。
另请参阅 setWindowTitle()。
[virtual noexcept] QDockWidget::~QDockWidget()
销毁dock控件。
[signal] void QDockWidget::allowedAreasChanged(Qt::DockWidgetAreas allowedAreas)
当allowedAreas 属性发生变化时,会触发此信号。allowedAreas 参数返回该属性的新值。
注意: 这是属性 `allowedAreas`的通知器 信号。
[override virtual protected] void QDockWidget::changeEvent(QEvent *event)
重写了:QWidget::changeEvent(QEvent *event)。
[override virtual protected] void QDockWidget::closeEvent(QCloseEvent *event)
重写了:QWidget::closeEvent(QCloseEvent *event)。
[signal] void QDockWidget::dockLocationChanged(Qt::DockWidgetArea area)
当停靠控件被移动到另一个停靠区area ,或被移动到其当前停靠区域内的其他位置时,会发出此信号。这种情况发生在通过编程方式移动停靠控件,或用户将其拖动到新位置时。
注意: 这是属性dockLocation的通知 信号。
另请参阅 dockLocation() 和setDockLocation()。
[override virtual protected] bool QDockWidget::event(QEvent *event)
重写了:QWidget::event(QEvent *event)。
[signal] void QDockWidget::featuresChanged(QDockWidget::DockWidgetFeatures features)
当features 属性发生变化时,将触发此信号。features 参数返回该属性的新值。
注意: 这是属性features 的通知器 信号。
[virtual protected] void QDockWidget::initStyleOption(QStyleOptionDockWidget *option) const
使用QDockWidget 中的值初始化 `option `。当子类需要 `QStyleOptionDockWidget`,但又不想自己填写所有信息时,此方法非常有用。
另请参阅 QStyleOption::initFrom()。
bool QDockWidget::isAreaAllowed(Qt::DockWidgetArea area) const
如果该停靠小部件可以放置在给定的area 中,则返回true ;否则返回false 。
[override virtual protected] void QDockWidget::paintEvent(QPaintEvent *event)
重写:QWidget::paintEvent(QPaintEvent *event)。
[since 6.9] void QDockWidget::setDockLocation(Qt::DockWidgetArea area)
将此停靠控件分配给area 。如果当前停靠在其他位置,它将移动到area 。如果处于浮动状态或属于浮动标签页,则下次调用setFloating(false)时,它将停靠在area 。
注意:setDockLocation (Qt::NoDockLocation) 与setFloating(true) 效果相同。
注意: 这是属性dockLocation 的设置 函数。
该函数在 Qt 6.9 中引入。
另请参阅 dockLocation() 和dockLocationChanged()。
void QDockWidget::setTitleBarWidget(QWidget *widget)
将任意widget 设置为停靠控件的标题栏。如果widget 的值为nullptr ,则之前在停靠控件上设置的任何自定义标题栏控件将被移除(但不会被删除),并改用默认标题栏。
如果设置了标题栏小部件,则当QDockWidget 处于浮动状态时,将不会使用本机窗口装饰。
以下是实现自定义标题栏的一些提示:
- 对于未被标题栏控件显式处理的鼠标事件,必须通过调用 `QMouseEvent::ignore()` 将其忽略。这些事件随后会传播到父控件 `QDockWidget `,由其以常规方式进行处理,例如在拖动标题栏时移动窗口,双击时进行停靠和取消停靠等。
- 当在 `QDockWidget` 上设置 `DockWidgetVerticalTitleBar ` 时,标题栏控件将相应地重新定位。在 `resizeEvent()` 中,标题栏应检查其应采用何种方向:
QDockWidget *dockWidget = qobject_cast<QDockWidget*>(parentWidget()); if (dockWidget->features() & QDockWidget::DockWidgetVerticalTitleBar) { // I need to be vertical } else { // I need to be horizontal } - 标题栏控件必须具有有效的QWidget::sizeHint() 和QWidget::minimumSizeHint() 方法。这些方法应考虑标题栏的当前方向。
- 无法从停靠控件中移除标题栏。不过,可以通过将默认构造的QWidget 设置为标题栏控件来实现类似效果。
如上所述使用qobject_cast() 时,标题栏控件可完全访问其父控件QDockWidget 。因此,它可以响应用户操作执行停靠和隐藏等操作。
另请参阅 titleBarWidget() 和DockWidgetVerticalTitleBar 。
void QDockWidget::setWidget(QWidget *widget)
将停靠小部件的小部件设置为widget 。
如果在添加widget 时停靠控件处于可见状态,则必须显式地调用show()。
请注意,在调用此函数之前,必须先添加widget 的布局;否则,widget 将不可见。
另请参阅 widget()。
QWidget *QDockWidget::titleBarWidget() const
返回设置在QDockWidget 上的自定义标题栏控件,如果未设置自定义标题栏,则返回nullptr 。
另请参阅 setTitleBarWidget()。
QAction *QDockWidget::toggleViewAction() const
返回一个可选中操作,该操作可添加到菜单和工具栏中,以便用户显示或关闭此停靠控件。
该操作的文本设置为停靠小部件的窗口标题。
QAction 对象由QDockWidget 拥有。当QDockWidget 被销毁时,该对象将被自动删除。
注意:该 操作不能用于通过编程方式显示或隐藏停靠控件。请使用visible 属性来实现此功能。
另请参阅 QAction::text 和QWidget::windowTitle 。
[signal] void QDockWidget::topLevelChanged(bool topLevel)
当floating 属性发生变化时,将触发此信号。若停靠控件当前处于浮动状态,则topLevel 参数为true;否则为false。
注意: 这是属性floating的通知 信号。
另请参阅 isWindow()。
[signal] void QDockWidget::visibilityChanged(bool visible)
当停靠控件变为visible (或不可见)时,会触发此信号。这种情况发生在控件被隐藏或显示时,以及当控件停靠在带标签的停靠区域中,且其标签被选中或取消选中时。
注意:该 信号可能与QWidget::isVisible() 不同。当停靠控件被最小化或转换为标签页形式,并关联到一个未选中或非活动的标签页时,就会出现这种情况。
QWidget *QDockWidget::widget() const
返回停靠控件对应的控件。如果尚未设置该控件,则该函数返回零。
另请参阅 setWidget()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.