Класс QMenuBar
Класс QMenuBar предоставляет горизонтальную строку меню. Подробнее...
| Заголовок: | #include <QMenuBar> |
| 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) |
Защищённые функции
| 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 or preferences | Меню приложения | Настройки | Если эта запись не найдена, пункт «Настройки» будет отключён |
| quit or 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 для приложения. Явное задание этого свойства переопределяет присутствие (или отсутствие) атрибута.
Это свойство было введено в Qt 4.6.
Функции доступа:
| 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().
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().
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.
Примечание: Использование значения, отличного от 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.
[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.
Функция была добавлена в Qt 4.1.
См. также activeAction().
void QMenuBar::setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)
Устанавливает заданный виджет widget, отображаемый слева от первого элемента меню или справа от последнего элемента меню, в зависимости от corner.
Панель меню принимает во владение widget, переродив его в панели меню. Однако, если угол уже содержит widget, этот предыдущий widget больше не будет управляться и по-прежнему останется видимым дочерним элементом панели меню.
Примечание: Использование угла, отличного от 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).
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-5.15/qmenubar.html