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