Класс QDesignerTaskMenuExtension
Класс QDesignerTaskMenuExtension позволяет добавлять пользовательские пункты меню в контекстное меню Qt Designer. Подробнее...
| Заголовок: | #include <QDesignerTaskMenuExtension> |
| CMake: | find_package(Qt6 COMPONENTS Designer REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Designer) |
| qmake: | QT += designer |
Открытые функции
| virtual | ~QDesignerTaskMenuExtension() |
| virtual QAction * | preferredEditAction() const |
| virtual QList<QAction *> | taskActions() const = 0 |
Подробное описание
QDesignerTaskMenuExtension предоставляет интерфейс для создания пользовательских расширений контекстного меню. Обычно используется для создания пунктов контекстного меню, специфичных для плагина в Qt Designer.
Qt Designer использует QDesignerTaskMenuExtension для заполнения своего контекстного меню. При каждом запросе контекстного меню Qt Designer будет запрашивать расширение контекстного меню для выбранного виджета.
Расширение контекстного меню — это набор QAction. Действия отображаются как пункты в контекстном меню, когда выбран плагин с указанным расширением. На рисунке выше показано пользовательское действие Изменить состояние..., которое появляется помимо стандартных пунктов контекстного меню Qt Designer: Вырезать, Копировать, Вставить и т. д.
Чтобы создать пользовательское расширение контекстного меню, ваш класс расширения должен наследовать как от QObject, так и от QDesignerTaskMenuExtension. Например:
class MyTaskMenuExtension : public QObject,
public QDesignerTaskMenuExtension
{
Q_OBJECT
Q_INTERFACES(QDesignerTaskMenuExtension)
public:
MyTaskMenuExtension(MyCustomWidget *widget, QObject *parent);
QAction *preferredEditAction() const;
QList<QAction *> taskActions() const;
private slots:
void mySlot();
private:
MyCustomWidget *widget;
QAction *myAction;
}; Поскольку мы реализуем интерфейс, мы должны убедиться, что он известен системе метаобъектов, используя макрос Q_INTERFACES(). Это позволяет Qt Designer использовать функцию qobject_cast() для запроса поддерживаемых интерфейсов, используя только указатель QObject.
Вы должны переопределить функцию taskActions() для возврата списка действий, которые будут включены в контекстное меню Qt Designer. По желанию, вы можете переопределить функцию preferredEditAction() для задания действия, которое вызывается при выборе вашего плагина и нажатии клавиши F2. Выбранное действие редактирования должно быть одним из действий, возвращаемых функцией taskActions(), и, если оно не определено, нажатие клавиши F2 будет просто проигнорировано.
В Qt Designer расширения создаются только тогда, когда они требуются. Расширение контекстного меню, например, создается, когда вы щелкаете правой кнопкой мыши по виджету в рабочем пространстве Qt Designer. Поэтому вы также должны создать фабрику расширений, используя QExtensionFactory или подкласс, и зарегистрировать её с помощью менеджера расширений Qt Designer.
Когда требуется расширение контекстного меню, менеджер расширений Qt Designer перебирает все зарегистрированные фабрики, вызывая QExtensionFactory::createExtension() для каждой, пока не найдёт фабрику, которая способна создать расширение контекстного меню для выбранного виджета. Затем эта фабрика создаёт экземпляр расширения.
Существует четыре доступных типа расширений в Qt Designer: QDesignerContainerExtension, QDesignerMemberSheetExtension, QDesignerPropertySheetExtension и QDesignerTaskMenuExtension. Поведение Qt Designer одинаково, независимо от того, связано ли запрашиваемое расширение с контейнером, вкладкой свойств или контекстным меню.
Класс QExtensionFactory предоставляет стандартную фабрику расширений и также может использоваться в качестве интерфейса для пользовательских фабрик расширений. Вы можете создать новую QExtensionFactory и переопределить функцию QExtensionFactory::createExtension(). Например:
QObject *ANewExtensionFactory::createExtension(QObject *object,
const QString &iid, QObject *parent) const
{
if (iid != Q_TYPEID(QDesignerTaskMenuExtension))
return 0;
if (MyCustomWidget *widget = qobject_cast<MyCustomWidget*>(object))
return new MyTaskMenuExtension(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(QDesignerContainerExtension))) {
return new MyContainerExtension(widget, parent);
} else if (widget && (iid == Q_TYPEID(QDesignerTaskMenuExtension))) {
return new MyTaskMenuExtension(widget, parent);
} else {
return 0;
}
} Для полного примера использования класса QDesignerTaskMenuExtension см. пример Расширение контекстного меню. В примере показано, как создать пользовательский плагин виджетов для Qt Designer и как использовать класс QDesignerTaskMenuExtension для добавления пользовательских элементов в контекстное меню Qt Designer.
См. также QExtensionFactory, QExtensionManager и Создание пользовательских расширений виджетов.
Документация по членам-функциям
[virtual] QDesignerTaskMenuExtension::~QDesignerTaskMenuExtension()
Уничтожает расширение контекстного меню.
[virtual] QAction *QDesignerTaskMenuExtension::preferredEditAction() const
Возвращает действие, которое вызывается при выборе плагина с указанным расширением и нажатии клавиши F2.
Действие должно быть одним из действий, возвращаемых функцией taskActions().
[pure virtual] QList<QAction *> QDesignerTaskMenuExtension::taskActions() const
Возвращает расширение контекстного меню в виде списка действий, которые будут включены в контекстное меню Qt Designer при выборе плагина с указанным расширением.
Функция должна быть переопределена для добавления действий в список.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qdesignertaskmenuextension.html