Spec-Zone.ru › Qt

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

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

Spec-Zone.ru

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