创建自定义小部件扩展

一旦你为 Qt Designer 准备了一个自定义小部件插件,你可以使用自定义小部件扩展在其工作空间内为其提供预期的行为和功能。

扩展类型

Qt Designer 中有几种扩展类型可用。你可以使用相同的格式,只需替换相应的扩展基类即可。

QDesignerContainerExtension 当实现自定义多页容器时是必需的。

QDesignerTaskMenuExtension

QDesignerTaskMenuExtension 对于自定义小部件很有用。它提供了一种扩展,允许向 Qt Designer 的任务菜单添加自定义菜单项。

任务菜单扩展 示例说明了如何使用此类。

QDesignerContainerExtension

QDesignerContainerExtension 当实现自定义多页容器时是必需的。它提供了一种扩展,允许你在 Qt Designer 中的多页容器插件中添加和删除页面。

容器扩展 示例进一步解释了如何使用此类。

注意:由于某些小部件(例如,QTabWidget)的实现方式,不可能为某些小部件添加自定义每页属性。

QDesignerMemberSheetExtension

QDesignerMemberSheetExtension 类允许你在连接信号和槽时操作显示的小部件成员函数。

QDesignerPropertySheetExtensionQDesignerDynamicPropertySheetExtension

这些扩展类允许你控制小部件属性在 Qt Designer 的属性编辑器中的显示方式。

Qt Designer 使用 QDesignerPropertySheetExtensionQDesignerMemberSheetExtension 类为其属性编辑器和信号与槽编辑器提供数据。每次在它的工作空间中选择一个小部件时,Qt Designer 都将查询小部件的属性表扩展;同样,当请求两个小部件之间的连接时,Qt Designer 将查询小部件的成员表扩展。

警告:所有小部件都有默认属性和成员表。如果你实现了自定义属性表或成员表扩展,你的自定义扩展将覆盖默认表。

创建一个扩展

要创建一个扩展,您必须继承QObject和相应的基类,并重新实现其函数。由于我们正在实现接口,我们必须确保使用扩展类的定义中的Q_INTERFACES() 宏将接口告知元对象系统。例如

class MyExtension: public QObject,
                   public QdesignerContainerExtension
{
    Q_OBJECT
    Q_INTERFACE(QDesignerContainerExtension)

    ...
}

这使 Qt Designer 能够通过仅使用 qobject_cast() 函数来查询支持的接口。

将扩展暴露给 Qt Designer

Qt Designer 中,扩展在需要时才被创建。因此,在实现扩展时,必须子类化QExtensionFactory以创建一个能够为您的扩展创建实例的类。此外,您必须将工厂注册到 Qt Designer 的扩展管理器中;扩展管理器负责创建扩展。

当请求扩展时,Qt Designer 的扩展管理器将遍历其已注册的工厂,为每个工厂调用 QExtensionFactory::createExtension(),直到找到一个能够为所选小部件创建请求的扩展的工厂。然后该工厂将创建扩展的实例。

创建扩展工厂

QExtensionFactory 类提供标准的扩展工厂,但它也可以用作自定义扩展工厂的接口。

目的是重新实现 QExtensionFactory::createExtension() 函数,使其能够创建您的扩展,例如一个 MultiPageWidget 容器扩展。

您可以选择创建一个新的 QExtensionFactory 并重新实现 QExtensionFactory::createExtension() 函数

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

    if (MyCustomWidget *widget = qobject_cast<MyCustomWidget*>
            (object))
        return new MyContainerExtension(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(QDesignerTaskMenuExtension))) {
         return new MyTaskMenuExtension(widget, parent);

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

    } else {
        return 0;
    }
}

访问 Qt Designer 的扩展管理器

在实现自定义小部件插件时,必须子类化 QDesignerCustomWidgetInterface 以将插件暴露给 Qt Designer。这在为 Qt Designer 创建自定义小部件 章节中有更详细的说明。扩展工厂的注册通常在 QDesignerCustomWidgetInterface::initialize() 函数中进行。

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

    QExtensionManager *manager = formEditor->extensionManager();
    Q_ASSERT(manager != 0);

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

    initialized = true;
}

QDesignerCustomWidgetInterface::initialize() 函数中,formEditor 参数是 Qt Designer 当前 QDesignerFormEditorInterface 对象的指针。您必须使用 QDesignerFormEditorInterface::extensionManager() 函数检索到 Qt Designer 的扩展管理器的接口。然后,您使用 QExtensionManager::registerExtensions() 函数来注册您的自定义扩展工厂。

有关在 Qt Designer 中创建自定义小部件扩展的更多信息,请参阅任务菜单扩展容器扩展示例。

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献归各自所有者所有。提供的文档根据自由软件基金会发布的于 GNU自由文档许可协议版1.3 的条款进行许可。Qt及其相关标志是芬兰及/或其他国家的The Qt Company Ltd.的商标。所有其他商标均归各自所有者所有。