Создание пользовательских расширений виджетов
После того, как у вас есть пользовательский плагин виджета для 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. Для получения интерфейса к менеджеру расширений Qt Designer необходимо использовать функцию QDesignerFormEditorInterface::extensionManager(). Затем вы используете функцию QExtensionManager::registerExtensions() для регистрации вашей пользовательской фабрики расширений.
Связанные примеры
Для получения дополнительной информации о создании пользовательских расширений виджетов в Qt Designer обратитесь к примерам расширения меню задач и расширения контейнера.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/designer-creating-custom-widgets-extensions.html