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