QWidgetAction Class

QWidgetAction 类通过一个接口扩展了QAction ,该接口用于将自定义 widget 插入基于动作的容器(如工具栏)。更多

Header: #include <QWidgetAction>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承: QAction

公共函数

QWidgetAction(QObject *parent)
virtual ~QWidgetAction()
QWidget *defaultWidget() const
void releaseWidget(QWidget *widget)
QWidget *requestWidget(QWidget *parent)
void setDefaultWidget(QWidget *widget)

保护函数

virtual QWidget *createWidget(QWidget *parent)
QList<QWidget *> createdWidgets() const
virtual void deleteWidget(QWidget *widget)

重新实现的受保护函数

virtual bool event(QEvent *event) override
virtual bool eventFilter(QObject *obj, QEvent *event) override

详细说明

应用程序中的大多数操作都可以用菜单中的项目或工具栏中的按钮来表示。但有时需要使用更复杂的部件。例如,文字处理器中的缩放操作可以通过QToolBar 中的QComboBox 来实现,它可以显示一系列不同的缩放级别。QToolBar 提供了QToolBar::insertWidget() 作为插入单个部件的便捷函数。但是,如果您想在多个容器中使用自定义部件实现可视化操作,那么您就必须子类化 QWidgetAction。

例如,如果一个 QWidgetAction 被添加到QToolBar ,那么QWidgetAction::createWidget() 就会被调用。对该函数的重新实现应使用指定的父类创建一个新的自定义 widget。

如果从容器 widget 中移除该操作,则会调用QWidgetAction::deleteWidget() 并将之前创建的自定义 widget 作为参数。默认实现会隐藏该 widget,并使用QObject::deleteLater() 将其删除。

如果只有一个自定义 widget,则可以使用setDefaultWidget() 将其设置为默认 widget。然后,如果该动作被添加到QToolBar ,或一般添加到支持 QWidgetAction 的动作容器中,就会使用该 widget。如果一个只有默认 widget 的 QWidgetAction 同时被添加到两个工具栏中,那么默认 widget 只会显示在该动作被添加到的第一个工具栏中。QWidgetAction 接管了默认 widget 的所有权。

请注意,激活该操作的责任在于部件,例如通过重新实现鼠标事件处理程序和调用QAction::trigger() 来激活。

macOS:在 macOS 上,如果将 widget 添加到应用程序菜单栏的菜单中,该 widget 就会被添加并开始运行,但会受到一些限制:

  1. Widget 会从QMenu 重新移至本地菜单视图。如果在其他地方显示菜单(如作为弹出式菜单),该 widget 将不会出现。
  2. 无法对窗口小部件进行焦点/键盘处理。
  3. 由于 Apple 的设计,目前无法在 widget 上进行鼠标跟踪。
  4. 在 macOS 10.4 中,将triggered() 信号连接到打开模式对话框的插槽会导致崩溃(苹果公司承认存在已知错误),解决方法是使用 QueuedConnection 而不是 DirectConnection。

另请参阅 QAction,QActionGroup, 和QWidget

成员函数文档

[explicit] QWidgetAction::QWidgetAction(QObject *parent)

parent 构建一个动作。

[virtual noexcept] QWidgetAction::~QWidgetAction()

销毁对象并释放已分配的资源。

[virtual protected] QWidget *QWidgetAction::createWidget(QWidget *parent)

当操作被添加到支持自定义 widget 的容器 widget 时,该函数将被调用。如果不希望在指定的parent widget 中使用自定义 widget 来表示操作,则应返回 0。

另请参阅 deleteWidget()。

[protected] QList<QWidget *> QWidgetAction::createdWidgets() const

返回已使用createWidget() 且当前正在被添加操作的部件使用的部件列表。

QWidget *QWidgetAction::defaultWidget() const

返回默认 widget。

另请参见 setDefaultWidget()。

[virtual protected] void QWidgetAction::deleteWidget(QWidget *widget)

每当使用createWidget() 创建的自定义widget 从显示该操作的容器部件中删除该操作时,都会调用该函数。默认实现会隐藏widget ,并使用QObject::deleteLater() 安排删除时间。

另请参阅 createWidget()。

[override virtual protected] bool QWidgetAction::event(QEvent *event)

重实现:QAction::event(QEvent *e)。

[override virtual protected] bool QWidgetAction::eventFilter(QObject *obj, QEvent *event)

重实现:QObject::eventFilter(QObject *watched, QEvent *event).

void QWidgetAction::releaseWidget(QWidget *widget)

释放指定的widget

支持动作的容器部件在删除部件动作时会调用此函数。

另请参阅 requestWidget()、deleteWidget() 和defaultWidget()。

QWidget *QWidgetAction::requestWidget(QWidget *parent)

返回表示动作的 widget,其给定值为parent

支持动作的容器部件可以调用此函数来请求一个部件作为动作的可视化表示。

另请参阅 releaseWidget()、createWidget() 和defaultWidget()。

void QWidgetAction::setDefaultWidget(QWidget *widget)

widget 设置为默认 widget。所有权将转移到QWidgetAction 。除非子类重新实现createWidget() 以返回一个新部件,否则当容器部件通过requestWidget() 请求一个部件时,将使用默认部件。

另请参阅 defaultWidget()。

© 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.