QDockWidget Class
QDockWidget 类提供了一个可停靠在QMainWindow 内或作为顶层窗口浮动在桌面上的 widget。更多
Header: | #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 提供了停靠窗口(dock widgets)的概念,也称为工具调色板或实用窗口。central widget 停靠窗口是放置在QMainWindow 中停靠窗口区域周围的辅助窗口。
终端用户可以在当前区域内移动停靠窗口,也可以将其移动到新的区域或浮动(如取消停靠)。QDockWidget API 允许程序员限制停靠窗口的移动、浮动和关闭能力,以及它们可以放置的区域。
外观
QDockWidget 由标题栏和内容区组成。标题栏显示停靠部件window title 、浮动按钮和关闭按钮。根据 QDockWidget 的状态,浮动按钮和关闭按钮可能被禁用或根本不显示。
标题栏和按钮的视觉外观取决于使用中的style 。
QDockWidget 充当其子窗口小部件的包装器,使用setWidget() 进行设置。应在子窗口部件中实施自定义尺寸提示、最小和最大尺寸以及尺寸策略。QDockWidget 将尊重它们,调整自己的约束条件,以包括框架和标题。不应在 QDockWidget 本身设置尺寸限制,因为它们会根据 QDockWidget 是否停靠而发生变化;停靠的 QDockWidget 没有框架,标题栏也较小。
注意: 在 macOS 上,如果 QDockWidget 有一个本地窗口句柄(例如,如果在它或其子窗口部件上调用了winId() ),那么由于限制,在解除停靠时将无法拖动停靠窗口部件。开始拖动可以解除停靠窗口部件的停靠状态,但需要第二次拖动才能移动停靠窗口部件本身。
另请参阅 QMainWindow 。
成员类型文档
枚举 QDockWidget::DockWidgetFeature
标志 QDockWidget::DockWidgetFeatures
常量 | 值 | 描述 |
---|---|---|
QDockWidget::DockWidgetClosable | 0x01 | dock 部件可以关闭。 |
QDockWidget::DockWidgetMovable | 0x02 | 用户可以在 dock 之间移动 dock 部件。 |
QDockWidget::DockWidgetFloatable | 0x04 | dock widget 可以从主窗口中分离出来,并作为一个独立窗口浮动。 |
QDockWidget::DockWidgetVerticalTitleBar | 0x08 | dock widget 的左侧会显示一个垂直标题栏。这可以用来增加QMainWindow 中的垂直空间。 |
QDockWidget::NoDockWidgetFeatures | 0x00 | dock widget 不能关闭、移动或浮动。 |
DockWidgetFeatures 类型是QFlags<DockWidgetFeature> 的类型定义。它存储了 DockWidgetFeature 值的 OR 组合。
属性文档
allowedAreas : Qt::DockWidgetAreas
可放置 dock widget 的区域
访问功能:
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) |
Notifier 信号:
void | dockLocationChanged(Qt::DockWidgetArea area) |
features : DockWidgetFeatures
该属性显示 dock 部件是否可移动、可关闭和可浮动。
默认情况下,该属性设置为DockWidgetClosable 、DockWidgetMovable 和DockWidgetFloatable 的组合。
访问功能:
QDockWidget::DockWidgetFeatures | features() const |
void | setFeatures(QDockWidget::DockWidgetFeatures features) |
Notifier 信号:
void | featuresChanged(QDockWidget::DockWidgetFeatures features) |
另请参阅 DockWidgetFeature 。
floating : bool
该属性表示 dock 部件是否浮动。
浮动 dock 部件是作为一个独立窗口 "位于 "其父QMainWindow 的 "顶部 "呈现给用户的,而不是停靠在QMainWindow 或一组标签式 dock 部件中。
浮动停靠窗口小部件可以通过编程或鼠标交互方式单独定位和调整大小。
默认情况下,该属性为true
。
当该属性发生变化时,会发出topLevelChanged()
信号。
访问功能:
bool | isFloating() const |
void | setFloating(bool floating) |
Notifier 信号:
void | topLevelChanged(bool topLevel) |
另请参阅 isWindow() 和topLevelChanged() 。
windowTitle : QString
该属性用于保存 dock 部件的标题(字幕)
默认情况下,该属性包含一个空字符串。
访问功能:
QString | windowTitle() const |
void | setWindowTitle(const QString &) |
Notifier 信号:
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())
构造一个 QDockWidget,其父级parent 和窗口标志flags 。该停靠窗口小部件将被放置在左侧的停靠窗口小部件区域。
窗口标题被设置为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)
当 dock 部件被移动到另一个 dockarea ,或者被移动到当前 dock 区域的不同位置时,就会发出这个信号。当用户以编程方式移动 dock 部件或将其拖动到新位置时,就会发生这种情况。
注: 属性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
如果该 dock widget 可以放置在给定的area 中,则返回true
;否则返回false
。
[override virtual protected]
void QDockWidget::paintEvent(QPaintEvent *event)
重实现:QWidget::paintEvent(QPaintEvent *event).
[since 6.9]
void QDockWidget::setDockLocation(Qt::DockWidgetArea area)
将此停靠 widget 指定到area 。如果停靠在其他停靠位置,它将移动到area 。如果是浮动或浮动标签的一部分,下一次调用setFloating(false) 将使它停靠在area 。
注: setDockLocation(Qt::NoDockLocation) 等同于setFloating(true)。
注: 属性dockLocation 的设置函数。
该函数在 Qt 6.9 中引入。
另请参阅 dockLocation() 和dockLocationChanged()。
void QDockWidget::setTitleBarWidget(QWidget *widget)
将任意widget 设置为 dock widget 的标题栏。如果widget 是nullptr
,之前在 dock widget 上设置的任何自定义标题栏 widget 都会被移除,但不会被删除,而将使用默认标题栏。
如果设置了标题栏部件,QDockWidget 在浮动时将不会使用本地窗口装饰。
以下是实现自定义标题栏的一些提示:
- 必须通过调用QMouseEvent::ignore() 来忽略标题栏部件未明确处理的鼠标事件。这些事件会传播到QDockWidget 父节点,父节点会以通常的方式处理这些事件,如拖动标题栏时移动、双击标题栏时停靠或取消停靠等。
- 当DockWidgetVerticalTitleBar 设置为QDockWidget 时,标题栏部件会相应地重新定位。在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() 函数。这些函数应考虑标题栏的当前方向。
- 从 dock widget 中移除标题栏是不可能的。不过,可以通过将默认构造的QWidget 设置为标题栏 widget 来达到类似的效果。
如上图所示,使用qobject_cast() 后,标题栏 widget 就可以完全访问其父QDockWidget 。因此,它可以根据用户操作执行停靠和隐藏等操作。
另请参阅 titleBarWidget() 和DockWidgetVerticalTitleBar 。
void QDockWidget::setWidget(QWidget *widget)
将 dock widget 设置为widget 。
如果在添加widget 时 dock 部件是可见的,则必须明确地show() 它。
请注意,必须在调用此函数前添加widget 的布局;否则,widget 将不可见。
另请参阅 widget() 。
QWidget *QDockWidget::titleBarWidget() const
返回在QDockWidget 上设置的自定义标题栏部件,如果没有设置自定义标题栏,则返回nullptr
。
另请参阅 setTitleBarWidget().
QAction *QDockWidget::toggleViewAction() const
返回一个可选中的操作,该操作可添加到菜单和工具栏中,以便用户显示或关闭该停靠窗口部件。
该操作的文本将设置为 dock 部件的窗口标题。
QAction 对象为QDockWidget 所有。当QDockWidget 被销毁时,该对象将被自动删除。
注意: 该操作不能用于以编程方式显示或隐藏 dock 部件。请使用visible 属性。
另请参阅 QAction::text 和QWidget::windowTitle 。
[signal]
void QDockWidget::topLevelChanged(bool topLevel)
当floating 属性发生变化时会发出该信号。如果 dock 部件现在是浮动的,则topLevel 参数为 true;否则为 false。
注: 属性floating 的通知信号。
另请参阅 isWindow().
[signal]
void QDockWidget::visibilityChanged(bool visible)
当停靠 widget 变为visible (或不可见)时,就会发出该信号。当该 widget 被隐藏或显示时,以及当它停靠在标签式停靠区,其标签被选中或取消选中时,都会发生这种情况。
注意: 信号可能与QWidget::isVisible() 不同。如果停靠窗口小部件被最小化或标签化,并与非选定或非活动标签页相关联,就会出现这种情况。
QWidget *QDockWidget::widget() const
返回 dock 部件的 widget。如果未设置 widget,则该函数返回 0。
另请参见 setWidget()。
© 2025 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.