Класс 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); END_OF_DOCUMENT_MARKER Элементы меню можно удалить с помощью 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 — действие, вызвавшее сигнал.
Примечание: 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)
Это перегруженная функция.
Эта удобная функция создаёт новое действие с заданным текстом text. Сигнал triggered() действия подключается к слоту member объекта receiver. Функция добавляет созданное действие в список действий меню и возвращает его.
См. также QWidget::addAction() и QWidget::actions().
END_OF_DOCUMENT_MARKER
[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.1/qmenubar.html