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