Spec-Zone.ru › Qt 5.9

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

После создания пользовательского плагина виджета для 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/qt-5.9/designer-creating-custom-widgets-extensions.html

Spec-Zone.ru

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