QExtensionManager Class

QExtensionManager 类为Qt Widgets Designer 提供扩展管理功能。更多

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

公共函数

QExtensionManager(QObject *parent = nullptr)
virtual ~QExtensionManager()

重新实现的公共函数

virtual QObject *extension(QObject *object, const QString &iid) const override
virtual void registerExtensions(QAbstractExtensionFactory *factory, const QString &iid = QString()) override
virtual void unregisterExtensions(QAbstractExtensionFactory *factory, const QString &iid = QString()) override
T qt_extension(QAbstractExtensionManager *manager, QObject *object)

Q_DECLARE_EXTENSION_INTERFACE(ExtensionName, Identifier)

详细说明

Qt Widgets Designer 中,扩展在需要时才会创建。因此,在实现扩展时,您还必须创建一个QExtensionFactory ,即一个能够创建扩展实例的类,并使用Qt Widgets Designer 的扩展管理器注册它。

扩展工厂的注册通常在QDesignerCustomWidgetInterface::initialize() 函数中进行:

        void MyPlugin::initialize(QDesignerFormEditorInterface *formEditor)
        {
            if (initialized)
                return;

            auto *manager = formEditor->extensionManager();
            Q_ASSERT(manager != nullptr);

            manager->registerExtensions(new MyExtensionFactory(manager),
                                        Q_TYPEID(QDesignerTaskMenuExtension));

            initialized = true;
        }

QExtensionManager 并不打算直接实例化。你可以使用QDesignerFormEditorInterface::extensionManager() 函数获取Qt Widgets Designer 扩展管理器的接口。QDesignerCustomWidgetInterface::initialize() 函数的参数提供了指向Qt Widgets Designer 当前QDesignerFormEditorInterface 对象(上例中为formEditor )的指针。在实现自定义 widget 插件时,必须子类化QDesignerCustomWidgetInterface ,以便将插件公开给Qt Widgets Designer

然后,当需要扩展时,Qt Widgets Designer 的扩展管理器将遍历其所有注册的工厂,对每个工厂调用QExtensionFactory::createExtension() 直到找到第一个能够为所选对象创建所需扩展的工厂。然后,该工厂将创建一个扩展实例。

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

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

另请参阅 QExtensionFactoryQAbstractExtensionManager

成员函数文档

[explicit] QExtensionManager::QExtensionManager(QObject *parent = nullptr)

使用给定的parent 构建扩展管理器。

[virtual noexcept] QExtensionManager::~QExtensionManager()

销毁扩展管理器

[override virtual] QObject *QExtensionManager::extension(QObject *object, const QString &iid) const

重实现:QAbstractExtensionManager::extension(QObject *object, const QString &iid) const.

返回iid 指定的扩展名,适用于给定的object

[override virtual] void QExtensionManager::registerExtensions(QAbstractExtensionFactory *factory, const QString &iid = QString())

重实现:QAbstractExtensionManager::registerExtensions(QAbstractExtensionFactory *factory, const QString &iid).

注册由给定的factory 和扩展标识符iid 指定的扩展。

[override virtual] void QExtensionManager::unregisterExtensions(QAbstractExtensionFactory *factory, const QString &iid = QString())

重实现:QAbstractExtensionManager::unregisterExtensions(QAbstractExtensionFactory *factory, const QString &iid).

取消注册由给定的factory 和扩展标识符iid 指定的扩展。

相关非成员

template <typename T> T qt_extension(QAbstractExtensionManager *manager, QObject *object)

如果对象属于 T 类型(或子类),则返回给定object 的扩展名,否则返回 0。扩展名通过给定的扩展名manager 获取。

       auto *manager = formEditor->extensionManager();

       auto *propertySheet = qt_extension<QDesignerPropertySheetExtension*>(manager, widget);

       if(propertySheet) {...}

实现自定义 widget 插件时,Qt Widgets Designer 的当前QDesignerFormEditorInterface 对象指针 (formEditor) 由QDesignerCustomWidgetInterface::initialize() 函数的参数提供。

如果上例中的 widget 没有定义QDesignerPropertySheetExtensionpropertySheet 将是一个空指针。

宏文档

Q_DECLARE_EXTENSION_INTERFACE(ExtensionName, Identifier)

将给定的Identifier (字面字符串)与名为ExtensionName 的扩展类关联。Identifier 必须是唯一的。例如

   Q_DECLARE_EXTENSION_INTERFACE(MyExtension, "com.mycompany.myproduct.myextension")

使用公司和产品名称是确保标识符唯一性的好方法。

在实现自定义扩展类时,必须使用 Q_DECLARE_EXTENSION_INTERFACE() 来启用qt_extension() 函数。该宏通常位于相关头文件中ExtensionName 的类定义之后。

另请参阅 Q_DECLARE_INTERFACE()。

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