Класс 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, к строке меню добавляются QMenus, а к выпадающим меню добавляются QActions.
Пример (из примера Меню):
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 для приложения. Явное задание этого свойства переопределяет наличие (или отсутствие) атрибута.
Функции доступа:
| 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 — действие, вызвавшее излучение сигнала.
Обычно каждое действие меню подключается к одному слоту с помощью QAction::triggered(), но иногда требуется подключить несколько элементов к одному слоту (чаще всего, если пользователь выбирает из массива). Этот сигнал полезен в таких случаях.
См. также hovered() и QAction::triggered().
[virtual] QMenuBar::~QMenuBar()
Уничтожает полосу меню.
QAction *QMenuBar::actionAt(const QPoint &pt) const
Возвращает QAction в позиции pt. Возвращает nullptr , если в заданной позиции нет действия или если в указанном месте находится разделитель.
См. также 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.
Примечание: Использование угла, отличного от 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)
Это устанавливает заданный widget, чтобы он отображался непосредственно слева от первого пункта меню или справа от последнего пункта меню, в зависимости от corner.
Панель меню принимает во владение widget, переродив его в панель меню. Однако, если corner уже содержит виджет, этот предыдущий виджет больше не будет управляться и по-прежнему будет видимым дочерним элементом панели меню.
Примечание: Использование угла, отличного от 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.2/qmenubar.html