Spec-Zone.ru › Qt 5.11

Создание пользовательских расширений виджетов

После создания плагина пользовательского виджета для Qt Designer, вы можете задать его ожидаемое поведение и функциональность в рабочем пространстве Qt Designer с помощью пользовательских расширений виджетов.

Типы расширений

В Qt Designer доступны несколько типов расширений. Вы можете использовать все эти расширения по одной и той же схеме, только заменив соответствующий базовый класс расширения.

QDesignerContainerExtension необходим при реализации пользовательского контейнера с несколькими страницами.

QDesignerTaskMenuExtension

QDesignerTaskMenuExtension полезен для пользовательских виджетов. Он предоставляет расширение, позволяющее добавлять пользовательские пункты меню в меню задач Qt Designer.

Пример расширения меню задач иллюстрирует, как использовать этот класс.

QDesignerContainerExtension

QDesignerContainerExtension необходим при реализации пользовательского контейнера с несколькими страницами. Он предоставляет расширение, позволяющее добавлять и удалять страницы для плагина контейнера с несколькими страницами в Qt Designer.

Пример расширения контейнера далее объясняет, как использовать этот класс.

Примечание: Невозможно добавить пользовательские свойства для отдельных страниц некоторых виджетов (например, QTabWidget) из-за способа их реализации.

QDesignerMemberSheetExtension

Класс QDesignerMemberSheetExtension позволяет управлять функциями членов виджета, отображаемыми при подключении сигналов и слотов.

QDesignerPropertySheetExtension, QDesignerDynamicPropertySheetExtension

Эти классы расширений позволяют управлять тем, как свойства виджета отображаются в редакторе свойств Qt Designer.

Qt Designer использует классы QDesignerPropertySheetExtension и QDesignerMemberSheetExtension для отображения редакторов свойств и сигналов и слотов. Всякий раз, когда виджет выбирается в рабочем пространстве, Qt Designer запросит расширение листа свойств виджета; аналогично, всякий раз, когда запрашивается подключение между двумя виджетами, Qt Designer запросит расширения листов членов виджетов.

Предупреждение: Все виджеты имеют стандартные листы свойств и членов. Если вы реализуете пользовательские расширения листа свойств или листа членов, ваши пользовательские расширения переопределят стандартные листы.

Создание расширения

Чтобы создать расширение, вы должны унаследовать как QObject, так и соответствующий базовый класс, и переопределить его функции. Поскольку мы реализуем интерфейс, мы должны убедиться, что он известен системе метаобъектов, используя макрос Q_INTERFACES() в определении класса расширения. Например:

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

    ...
}

Это позволяет Qt Designer использовать функцию qobject_cast() для запроса поддерживаемых интерфейсов, используя только указатель QObject.

Отображение расширения в 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;
}

Параметр formEditor в функции QDesignerCustomWidgetInterface::initialize() — это указатель на текущий объект QDesignerFormEditorInterface Qt Designer. Вы должны использовать функцию QDesignerFormEditorInterface::extensionManager() для получения интерфейса к менеджеру расширений Qt Designer. Затем используйте функцию QExtensionManager::registerExtensions() для регистрации вашей пользовательской фабрики расширений.

Связанные примеры

Для получения дополнительной информации о создании пользовательских расширений виджетов в Qt Designer, обратитесь к примерам расширения меню задач и расширения контейнера.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/designer-creating-custom-widgets-extensions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API