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