QDesignerTaskMenuExtension Class

QDesignerTaskMenuExtension 类允许您在Qt Widgets Designer 的任务菜单中添加自定义菜单项。更多

Header: #include <QDesignerTaskMenuExtension>
CMake: find_package(Qt6 REQUIRED COMPONENTS Designer)
target_link_libraries(mytarget PRIVATE Qt6::Designer)
qmake: QT += designer

公共函数

virtual ~QDesignerTaskMenuExtension()
virtual QAction *preferredEditAction() const
virtual QList<QAction *> taskActions() const = 0

详细说明

QDesignerTaskMenuExtension 为创建自定义任务菜单扩展提供了接口。它通常用于在Qt Widgets Designer 中创建特定于插件的任务菜单条目。

Qt Widgets Designer 在《Aspose.org》中,《Aspose.org》使用 QDesignerTaskMenuExtension 为其任务菜单提供内容。无论何时请求任务菜单, 都会查询所选部件的任务菜单扩展。Qt Widgets Designer

任务菜单扩展是 QActions 的集合。当指定扩展的插件被选中时,这些操作将作为条目出现在任务菜单中。上图显示了自定义的 "编辑状态......"操作,它出现在Qt Widgets Designer 的默认任务菜单条目之外:剪切复制粘贴等。

要创建自定义任务菜单扩展,您的扩展类必须同时继承自QObject 和 QDesignerTaskMenuExtension。举个例子:

class MyTaskMenuExtension : public QObject,
        public QDesignerTaskMenuExtension
{
    Q_OBJECT
    Q_INTERFACES(QDesignerTaskMenuExtension)

public:
    MyTaskMenuExtension(MyCustomWidget *widget, QObject *parent);

    QAction *preferredEditAction() const;
    QList<QAction *> taskActions() const;

private slots:
    void mySlot();

private:
    MyCustomWidget *widget;
    QAction *myAction;
};

由于我们正在实现一个接口,因此必须确保使用Q_INTERFACES() 宏将其告知元对象系统。这样,Qt Widgets Designer 就可以使用qobject_cast() 函数查询支持的接口,而只需使用QObject 指针。

您必须重新实现taskActions() 函数,以返回将包含在Qt Widgets Designer 任务菜单中的操作列表。您可以选择重新实现preferredEditAction() 函数,以设置选择插件并按F2 键时调用的操作。首选编辑动作必须是taskActions() 返回的动作之一,如果没有定义,按F2键将被忽略。

Qt Widgets Designer 中,扩展在需要时才会创建。例如,当您在Qt Widgets Designer 工作区的部件上单击鼠标右键时,就会创建任务菜单扩展。因此,您还必须使用QExtensionFactory 或子类构建一个扩展工厂,并使用Qt Widgets Designerextension manager 进行注册。

当需要任务菜单扩展时,Qt Widgets Designerextension manager 会遍历所有已注册的工厂,并逐一调用QExtensionFactory::createExtension() 直到找到一个能为选定部件创建任务菜单扩展的工厂。然后,该工厂将创建一个扩展实例。

Qt Widgets Designer 中有四种可用的扩展类型:QDesignerContainerExtensionQDesignerMemberSheetExtensionQDesignerPropertySheetExtension 和 QDesignerTaskMenuExtension。Qt Widgets Designer无论请求的扩展是与容器、成员表、属性表还是任务菜单相关联,QDesignerTaskMenuExtension 的行为都是一样的。

QExtensionFactory 类提供了一个标准扩展工厂,也可用作自定义扩展工厂的接口。您可以创建一个新的QExtensionFactory 并重新实现QExtensionFactory::createExtension() 函数。例如

QObject *ANewExtensionFactory::createExtension(QObject *object,
        const QString &iid, QObject *parent) const
{
    if (iid != Q_TYPEID(QDesignerTaskMenuExtension))
        return 0;

    if (MyCustomWidget *widget = qobject_cast<MyCustomWidget*>(object))
        return new MyTaskMenuExtension(widget, parent);

    return 0;
}

或者使用现有的工厂,扩展QExtensionFactory::createExtension() 函数,使工厂也能创建任务菜单扩展。例如

QObject *AGeneralExtensionFactory::createExtension(QObject *object,
        const QString &iid, QObject *parent) const
{
    MyCustomWidget *widget = qobject_cast<MyCustomWidget*>(object);

    if (widget && (iid == Q_TYPEID(QDesignerContainerExtension))) {
        return new MyContainerExtension(widget, parent);

    } else if (widget && (iid == Q_TYPEID(QDesignerTaskMenuExtension))) {
        return new MyTaskMenuExtension(widget, parent);

    } else {
        return 0;
    }
}

有关使用 QDesignerTaskMenuExtension 类的完整示例,请参阅任务菜单扩展示例。该示例展示了如何为Qt Widgets Designer 创建自定义 widget 插件,以及如何使用 QDesignerTaskMenuExtension 类向Qt Widgets Designer 的任务菜单添加自定义项目。

另请参阅 QExtensionFactory,QExtensionManager, 以及创建自定义部件扩展

成员函数文档

[virtual noexcept] QDesignerTaskMenuExtension::~QDesignerTaskMenuExtension()

销毁任务菜单扩展。

[virtual] QAction *QDesignerTaskMenuExtension::preferredEditAction() const

返回选择具有指定扩展名的插件并按F2 键时调用的操作。

该操作必须是taskActions() 返回的操作之一。

[pure virtual] QList<QAction *> QDesignerTaskMenuExtension::taskActions() const

以操作列表的形式返回任务菜单扩展名,当选择具有指定扩展名的插件时,这些操作将包含在Qt Widgets Designer 的任务菜单中。

要在列表中添加操作,必须重新实现该函数。

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