Класс QMenuBar
Класс QMenuBar предоставляет горизонтальную строку меню. Подробнее...
| Заголовок: | #include <QMenuBar> |
| CMake: | find_package(Qt6 COMPONENTS Widgets REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Наследуется от: | QWidget |
Свойства
- defaultUp : bool
- nativeMenuBar : bool
Открытые функции
| QMenuBar(QWidget *parent = nullptr) | |
| virtual | ~QMenuBar() |
| QAction * | actionAt(const QPoint &pt) const |
| QRect | actionGeometry(QAction *act) const |
| QAction * | activeAction() const |
| QAction * | addAction(const QString &text) |
| QAction * | addAction(const QString &text, const QObject *receiver, const char *member) |
| QAction * | addAction(const QString &text, const Obj *receiver, PointerToMemberFunctionOrFunctor method) |
| QAction * | addAction(const QString &text, Functor functor) |
| QAction * | addMenu(QMenu *menu) |
| QMenu * | addMenu(const QString &title) |
| QMenu * | addMenu(const QIcon &icon, const QString &title) |
| QAction * | addSeparator() |
| void | clear() |
| QWidget * | cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const |
| QAction * | insertMenu(QAction *before, QMenu *menu) |
| QAction * | insertSeparator(QAction *before) |
| bool | isDefaultUp() const |
| bool | isNativeMenuBar() const |
| void | setActiveAction(QAction *act) |
| void | setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner) |
| void | setDefaultUp(bool) |
| void | setNativeMenuBar(bool nativeMenuBar) |
| NSMenu * | toNSMenu() |
Переопределённые открытые функции
| virtual int | heightForWidth(int) const override |
| virtual QSize | minimumSizeHint() const override |
| virtual QSize | sizeHint() const override |
Открытые слоты
| virtual void | setVisible(bool visible) override |
Сигналы
| void | hovered(QAction *action) |
| void | triggered(QAction *action) |
Защищённые функции
| virtual void | initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const |
Переопределённые защищённые функции
| virtual void | actionEvent(QActionEvent *e) override |
| virtual void | changeEvent(QEvent *e) override |
| virtual bool | event(QEvent *e) override |
| virtual bool | eventFilter(QObject *object, QEvent *event) override |
| virtual void | focusInEvent(QFocusEvent *) override |
| virtual void | focusOutEvent(QFocusEvent *) override |
| virtual void | keyPressEvent(QKeyEvent *e) override |
| virtual void | leaveEvent(QEvent *) override |
| virtual void | mouseMoveEvent(QMouseEvent *e) override |
| virtual void | mousePressEvent(QMouseEvent *e) override |
| virtual void | mouseReleaseEvent(QMouseEvent *e) override |
| virtual void | paintEvent(QPaintEvent *e) override |
| virtual void | resizeEvent(QResizeEvent *) override |
| virtual void | timerEvent(QTimerEvent *e) override |
Подробное описание
Панель меню состоит из списка раскрывающихся пунктов меню. Вы добавляете пункты меню с помощью addMenu(). Например, предполагая, что menubar является указателем на QMenuBar, а fileMenu — указателем на QMenu, следующее утверждение вставляет меню в панель меню:
menubar->addMenu(fileMenu);
Символ амперсанда в тексте пункта меню задаёт сочетание клавиш Alt+F для этого меню. (Можно использовать "&&" для отображения реального амперсанда в панели меню.)
Нет необходимости в расположении панели меню. Она автоматически устанавливает свою геометрию в верхней части родительского виджета и соответственно изменяет её при каждом изменении размера родительского виджета.
Использование
В большинстве приложений с главным окном вы бы использовали функцию menuBar(), предоставляемую классом QMainWindow, добавляя QMenu к панели меню и добавляя QAction к всплывающим меню.
Пример (из примера Меню):
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct); Элементы меню можно удалить с помощью removeAction().
Виджеты можно добавлять в меню, используя экземпляры класса QWidgetAction для их хранения. Эти действия затем можно вставлять в меню обычным способом; для получения более подробной информации см. документацию по QMenu.
Зависимость от платформы внешнего вида и поведения
Разные платформы имеют разные требования к внешнему виду панелей меню и их поведению при взаимодействии с пользователем. Например, системы Windows часто настраиваются таким образом, что подчёркнутые символы-мнемоники, указывающие на сочетания клавиш для элементов в панели меню, отображаются только при нажатии клавиши Alt.
QMenuBar как глобальная панель меню
В macOS и в определённых средах рабочего стола Linux, таких как Ubuntu Unity, QMenuBar является оболочкой для использования глобальной панели меню. Если у вас несколько панелей меню в одном диалоговом окне, то внешняя панель меню (обычно внутри виджета с флагом виджета Qt::Window) будет использоваться для глобальной панели меню.
Qt для macOS также предоставляет функцию слияния панелей меню, чтобы QMenuBar соответствовала общепринятой структуре панели меню macOS. Функциональность слияния основана на сопоставлении строк с названием записи QMenu. Эти строки переводятся (с помощью QObject::tr()) в контексте «QMenuBar». Если запись перемещена, её слоты всё равно будут срабатывать так, как если бы она находилась на первоначальном месте. Таблица ниже описывает искомые строки и место размещения записи, если совпадение найдено:
| Совпадение строки | Расположение | Примечания |
|---|---|---|
| about.* | Меню приложения | О программе <название приложения> | Название приложения извлекается из файла Info.plist (см. примечание ниже). Если эта запись не найдена, элемент «О программе» не будет отображаться в меню приложения. |
| config, options, setup, settings или preferences | Меню приложения | Настройки | Если эта запись не найдена, элемент «Настройки» будет отключён |
| quit или exit | Меню приложения | Выход <название приложения> | Если эта запись не найдена, будет создан стандартный элемент «Выход», который вызовет QCoreApplication::quit() |
Вы можете переопределить это поведение, используя свойство QAction::menuRole().
Если вы хотите, чтобы все окна приложения Mac использовали одну панель меню, вы должны создать панель меню без родителя. Создайте панель меню без родителя так:
QMenuBar *menuBar = new QMenuBar(nullptr);
Примечание: не используйте QMainWindow::menuBar() для создания общей панели меню, потому что эта панель меню будет иметь QMainWindow в качестве родителя. Эта панель меню будет отображаться только для родительского QMainWindow.
Примечание: Текст, используемый для названия приложения в панели меню macOS, извлекается из значения, заданного в файле Info.plist в пакете приложения. Для получения дополнительной информации см. Qt для macOS — Развёртывание.
Примечание: В Linux, если служба com.canonical.AppMenu.Registrar доступна на сеансовом шине D-Bus, Qt будет взаимодействовать с ней для установки меню приложения в глобальную панель меню, как описано.
Примеры
Пример Меню демонстрирует использование QMenuBar и QMenu. Другие примеры приложений главного окна также используют эти классы для меню.
См. также QMenu, QShortcut, QAction, Введение в Руководство по принципам интерфейса пользователя Apple, Справочник по проектированию графического интерфейса пользователя: Панель меню и Пример меню.
Документация свойств
defaultUp : bool
Это свойство содержит ориентацию всплывающего меню
Стандартная ориентация всплывающего меню. По умолчанию меню всплывает «вниз» по экрану. Установив свойство в true, меню будет всплывать «вверх». Вы можете использовать это для меню, которые находятся ниже документа, к которому они относятся.
Если меню не помещается на экране, другая ориентация используется автоматически.
Функции доступа:
| bool | isDefaultUp() const |
| void | setDefaultUp(bool) |
nativeMenuBar : bool
Это свойство указывает, будет ли использоваться панель меню как родная на платформах, которые её поддерживают
Это свойство определяет, будет ли панель меню использоваться как родная панель меню на платформах, которые её поддерживают. В настоящее время поддерживаются macOS и рабочие столы Linux, использующие интерфейс D-Bus com.canonical.dbusmenu (например, Ubuntu Unity). Если это свойство true, панель меню используется в качестве родной и не находится в окне своего родителя; если false, панель меню остаётся в окне. На других платформах установка этого атрибута не оказывает влияния, и чтение этого атрибута всегда вернёт false.
По умолчанию используется значение, соответствующее установке атрибута Qt::AA_DontUseNativeMenuBar для приложения. Явное задание этого свойства переопределяет наличие (или отсутствие) атрибута.
Функции доступа:
| bool | isNativeMenuBar() const |
| void | setNativeMenuBar(bool nativeMenuBar) |
Документация функций-членов
QMenuBar::QMenuBar(QWidget *parent = nullptr)
Создаёт панель меню с родителем parent.
[signal] void QMenuBar::hovered(QAction *action)
Этот сигнал генерируется, когда выделено действие меню; action — действие, вызвавшее событие.
Часто это используется для обновления статусной информации.
См. также triggered() и QAction::hovered().
[override virtual slot] void QMenuBar::setVisible(bool visible)
Реализует функцию доступа к свойству: QWidget::visible.
[signal] void QMenuBar::triggered(QAction *action)
Этот сигнал генерируется, когда действие в меню, принадлежащем этой панели меню, активируется в результате щелчка мыши; action — действие, вызвавшее сигнал.
Примечание: QMenuBar должен владеть QMenu для работы этого сигнала.
Обычно каждое действие меню подключается к одному слоту с помощью QAction::triggered(), но иногда вам понадобится подключить несколько элементов к одному слоту (чаще всего, если пользователь выбирает из массива). Этот сигнал полезен в таких случаях.
См. также hovered() и QAction::triggered().
[virtual] QMenuBar::~QMenuBar()
Удаляет панель меню.
QAction *QMenuBar::actionAt(const QPoint &pt) const
Возвращает QAction в позиции pt. Возвращает nullptr , если в позиции pt нет действия или в этой позиции находится разделитель.
См. также addAction() и addSeparator().
[override virtual protected] void QMenuBar::actionEvent(QActionEvent *e)
Переопределяет: QWidget::actionEvent(QActionEvent *event).
QRect QMenuBar::actionGeometry(QAction *act) const
Возвращает геометрию действия act в виде QRect.
См. также actionAt().
QAction *QMenuBar::activeAction() const
Возвращает QAction, который в данный момент выделен, если есть, иначе nullptr.
См. также setActiveAction().
QAction *QMenuBar::addAction(const QString &text)
Эта функция-удобство создаёт новое действие с текстом text. Функция добавляет созданное действие в список действий меню и возвращает его.
См. также QWidget::addAction() и QWidget::actions().
QAction *QMenuBar::addAction(const QString &text, const QObject *receiver, const char *member)
Это перегруженная функция.
Эта функция-удобство создаёт новое действие с заданным текстом text. Сигнал triggered() действия подключается к слоту member объекта receiver. Функция добавляет созданное действие в список действий меню и возвращает его.
См. также QWidget::addAction() и QWidget::actions().
[since 5.11] template <typename Obj, typename PointerToMemberFunctionOrFunctor> QAction *QMenuBar::addAction(const QString &text, const Obj *receiver, PointerToMemberFunctionOrFunctor method)
Это перегруженный метод.
Эта функция-помощник создаёт новое действие с заданным значением text. Сигнал triggered() действия подключается к методу method объекта receiver. Функция добавляет созданное действие в список действий меню и возвращает его.
QMenuBar берёт во владение возвращённое QAction.
Эта функция была добавлена в Qt 5.11.
См. также QWidget::addAction() и QWidget::actions().
[since 5.11] template <typename Functor> QAction *QMenuBar::addAction(const QString &text, Functor functor)
Это перегруженный метод.
Эта функция-помощник создаёт новое действие с заданным значением text. Сигнал triggered() действия подключается к functor. Функция добавляет созданное действие в список действий меню и возвращает его.
QMenuBar берёт во владение возвращённое QAction.
Эта функция была добавлена в Qt 5.11.
См. также QWidget::addAction() и QWidget::actions().
QAction *QMenuBar::addMenu(QMenu *menu)
Добавляет menu в строку меню. Возвращает menuAction() меню. Строка меню не берёт во владение меню.
Примечание: Возвращаемый объект QAction может использоваться для скрытия соответствующего меню.
См. также QWidget::addAction() и QMenu::menuAction().
QMenu *QMenuBar::addMenu(const QString &title)
Добавляет новое QMenu с названием title в строку меню. Строка меню берёт во владение меню. Возвращает созданное меню.
См. также QWidget::addAction() и QMenu::menuAction().
QMenu *QMenuBar::addMenu(const QIcon &icon, const QString &title)
Добавляет новое QMenu с иконкой icon и названием title в строку меню. Строка меню берёт во владение меню. Возвращает созданное меню.
См. также QWidget::addAction() и QMenu::menuAction().
QAction *QMenuBar::addSeparator()
Добавляет разделитель в меню.
[override virtual protected] void QMenuBar::changeEvent(QEvent *e)
Переопределяет: QWidget::changeEvent(QEvent *event).
void QMenuBar::clear()
Удаляет все действия из строки меню.
Примечание: В macOS элементы меню, которые были объединены в системное меню, не удаляются этой функцией. Один из способов решения этой проблемы — удалить дополнительные действия самостоятельно. Можно установить роль меню для разных меню, чтобы заранее знать, какие элементы меню будут объединены, а какие нет. Затем самостоятельно решить, что пересоздавать, а что удалять.
См. также removeAction().
QWidget *QMenuBar::cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const
Возвращает виджет слева от первого или справа от последнего элемента меню, в зависимости от corner.
Примечание: Использование значения corner отличного от Qt::TopRightCorner или Qt::TopLeftCorner приведёт к предупреждению.
См. также setCornerWidget().
[override virtual protected] bool QMenuBar::event(QEvent *e)
Переопределяет: QWidget::event(QEvent *event).
[override virtual protected] bool QMenuBar::eventFilter(QObject *object, QEvent *event)
Переопределяет: QObject::eventFilter(QObject *watched, QEvent *event).
[override virtual protected] void QMenuBar::focusInEvent(QFocusEvent *)
Переопределяет: QWidget::focusInEvent(QFocusEvent *event).
[override virtual protected] void QMenuBar::focusOutEvent(QFocusEvent *)
Переопределяет: QWidget::focusOutEvent(QFocusEvent *event).
[override virtual] int QMenuBar::heightForWidth(int) const
Переопределяет: QWidget::heightForWidth(int w) const.
[virtual protected] void QMenuBar::initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const
Инициализирует option значениями из строки меню и информацией из action. Этот метод полезен для подклассов, когда им нужен QStyleOptionMenuItem, но они не хотят сами заполнять всю информацию.
См. также QStyleOption::initFrom() и QMenu::initStyleOption().
QAction *QMenuBar::insertMenu(QAction *before, QMenu *menu)
Вставляет menu перед действием before и возвращает menuAction() меню.
См. также QWidget::insertAction() и addMenu().
QAction *QMenuBar::insertSeparator(QAction *before)
Создаёт новое действие-разделитель, т.е. действие, для которого QAction::isSeparator() возвращает true. Функция вставляет созданное действие в список действий строки меню перед действием before и возвращает его.
См. также QWidget::insertAction() и addSeparator().
[override virtual protected] void QMenuBar::keyPressEvent(QKeyEvent *e)
Переопределяет: QWidget::keyPressEvent(QKeyEvent *event).
[override virtual protected] void QMenuBar::leaveEvent(QEvent *)
Переопределяет: QWidget::leaveEvent(QEvent *event).
[override virtual] QSize QMenuBar::minimumSizeHint() const
Переопределяет функцию-доступ к свойству: QWidget::minimumSizeHint.
[override virtual protected] void QMenuBar::mouseMoveEvent(QMouseEvent *e)
Переопределяет: QWidget::mouseMoveEvent(QMouseEvent *event).
[override virtual protected] void QMenuBar::mousePressEvent(QMouseEvent *e)
Переопределяет: QWidget::mousePressEvent(QMouseEvent *event).
[override virtual protected] void QMenuBar::mouseReleaseEvent(QMouseEvent *e)
Переопределяет: QWidget::mouseReleaseEvent(QMouseEvent *event).
[override virtual protected] void QMenuBar::paintEvent(QPaintEvent *e)
Переопределяет: QWidget::paintEvent(QPaintEvent *event).
[override virtual protected] void QMenuBar::resizeEvent(QResizeEvent *)
Переопределяет: QWidget::resizeEvent(QResizeEvent *event).
void QMenuBar::setActiveAction(QAction *act)
Устанавливает текущее выделенное действие в act.
См. также activeAction().
void QMenuBar::setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)
Это устанавливает заданный виджет для отображения непосредственно слева от первого пункта меню или справа от последнего пункта меню, в зависимости от угла.
Панель меню получает во владение виджет, переродив его в панель меню. Однако, если угол уже содержит виджет, этот предыдущий виджет больше не будет управляться и по-прежнему будет видимым дочерним элементом панели меню.
Примечание: Использование угла, отличного от Qt::TopRightCorner или Qt::TopLeftCorner, приведет к появлению предупреждения.
См. также cornerWidget().
[override virtual] QSize QMenuBar::sizeHint() const
Переопределяет функцию доступа к свойству: QWidget::sizeHint.
[override virtual protected] void QMenuBar::timerEvent(QTimerEvent *e)
Переопределяет: QObject::timerEvent(QTimerEvent *event).
[since 5.2] NSMenu *QMenuBar::toNSMenu()
Возвращает родной NSMenu для этой панели меню. Доступно только в macOS.
Примечание: Qt может установить делегата на родной панели меню. Если вам нужно установить собственного делегата, убедитесь, что вы сохранили исходный и перенаправили все вызовы к нему.
Эта функция была добавлена в Qt 5.2.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qmenubar.html