Класс QDesignerTaskMenuExtension
Класс QDesignerTaskMenuExtension позволяет добавлять пользовательские пункты меню в контекстное меню Qt Designer. Подробнее...
| Заголовок: | #include <QDesignerTaskMenuExtension> |
| 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-5.13/qdesignertaskmenuextension.html