Класс 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(0);
Примечание: не используйте 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::setVisible(bool 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 если в указанной точке нет действия или если расположение является разделителем.
См. также 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)
Это перегруженная функция.
Эта вспомогательная функция создаёт новую команду с заданным текстом. Сигнал triggered() команды подключается к слоту member объекта receiver. Функция добавляет созданную команду в список команд меню и возвращает её.
См. также QWidget::addAction() и QWidget::actions().
QAction *QMenuBar::addAction(const QString &text, const Obj *receiver, PointerToMemberFunctionOrFunctor method)
Это перегруженная функция.
Эта вспомогательная функция создаёт новую команду с заданным текстом. Сигнал triggered() команды подключается к методу method объекта receiver. Функция добавляет созданную команду в список команд меню и возвращает её.
QMenuBar берёт на себя владение возвращённым объектом QAction.
Функция была добавлена в Qt 5.11.
См. также QWidget::addAction() и QWidget::actions().
QAction *QMenuBar::addAction(const QString &text, Functor functor)
Это перегруженная функция.
Эта вспомогательная функция создаёт новую команду с заданным текстом. Сигнал 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.
[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() const.
[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, переродировывая его в панель меню. Однако, если corner уже содержит widget, этот предыдущий widget больше не будет управляться и всё ещё будет видимым дочерним элементом панели меню.
Примечание: Использование угла, отличного от Qt::TopRightCorner или Qt::TopLeftCorner, приведёт к появлению предупреждения.
См. также cornerWidget().
[override virtual] QSize QMenuBar::sizeHint() const
Переопределяет: QWidget::sizeHint() const.
[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.13/qmenubar.html