QMenuBar Class
QMenuBar 类提供了一个水平菜单栏。更多内容...
| 头文件: | #include <QMenuBar> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) 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 * | 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 |
信号
受保护函数
| 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 设置为该菜单的快捷键。(若要在菜单栏中显示真正的“&”符号,请使用“&&”。)
无需手动布局菜单栏。它会自动将自身几何位置设置在父控件的顶部,并在父控件调整大小时相应地进行调整。
用法
在大多数主窗口风格的应用程序中,您会使用QMainWindow 中提供的menuBar()函数,将QMenu添加到菜单栏,并将QAction添加到弹出菜单中。
示例(摘自“菜单”示例):
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);可通过removeAction() 移除菜单项。
可以通过使用QWidgetAction 类的实例来容纳控件,从而将控件添加到菜单中。随后可以按照常规方式将这些操作插入到菜单中;更多详细信息请参阅QMenu 的文档。
与平台相关的界面风格
不同平台对菜单栏的外观及其在用户交互时的行为有不同的要求。例如,Windows 系统通常配置为:只有按下Alt 键时,才会显示用于指示菜单栏项目快捷键的下划线字符助记符。
QMenuBar 作为全局菜单栏
在 macOS 以及某些 Linux 桌面环境(如 Ubuntu Unity)中,QMenuBar 是用于调用系统级菜单栏的封装类。如果一个对话框中包含多个菜单栏,则最外层的菜单栏(通常位于具有Qt::Window 控件标志的控件内)将被用作系统级菜单栏。
macOS 版的 Qt 还提供菜单栏合并功能,使 QMenuBar 能更紧密地遵循通用的 macOS 菜单栏布局。如果某个菜单项被移动,其槽函数仍会像它位于原始位置时一样触发。
该合并功能基于菜单条目的QAction::menuRole()方法。如果某项具有QAction::TextHeuristicRole ,则通过以下启发式规则,根据标题的字符串匹配结果来确定其角色:
| 字符串匹配 | 位置 | 备注 |
|---|---|---|
| about.* | 应用程序菜单 | 关于 <应用程序名称> | 应用程序名称从Info.plist 文件中获取(参见下文注释)。如果未找到此条目,则“应用程序”菜单中不会显示“关于”选项。 |
| config、options、setup、settings 或 preferences | 应用程序菜单 | 首选项 | 若未找到此条目,“设置”选项将被禁用 |
| 退出或关闭 | 应用程序菜单 | 退出 <应用程序名称> | 如果未找到此条目,将创建一个默认的“退出”选项,用于调用QCoreApplication::quit() |
您可以通过将QAction::menuRole()属性设置为QAction::NoRole 来覆盖此行为。
如果您希望 Mac 应用程序中的所有窗口共享一个菜单栏,则必须创建一个没有父级元素的菜单栏。请按以下方式创建无父级的菜单栏:
注意:请勿调用QMainWindow::menuBar() 来创建共享菜单栏,因为该菜单栏将把QMainWindow 作为其父级。该菜单栏仅会显示在父级QMainWindow 上。
注意:macOS 菜单栏中应用程序名称所用的文本,来自应用程序包中Info.plist 文件中设置的值。更多信息请参阅《Qt for macOS - 部署》。
注意:在 Linux 上,如果 Qt D-Bus 会话总线上提供了 com.canonical.AppMenu.Registrar 服务,则 Qt 将与该服务通信,将应用程序的菜单安装到全局菜单栏中,如上所述。
示例
“Menus”示例演示了如何使用 QMenuBar 和QMenu 。其他主窗口应用程序示例也通过这些类提供了菜单功能。
另请参阅 QMenu 、QShortcut 、QAction 、《Apple 人机界面指南简介》以及“菜单示例”。
属性文档
defaultUp : bool
该属性用于控制弹出菜单的方向
默认的弹出方向。默认情况下,菜单会“向下”弹出。将该属性设置为 true 时,菜单将“向上”弹出。当菜单位于其所引用的文档下方时,您可以调用此属性。
如果菜单无法完全显示在屏幕上,系统会自动采用另一种方向。
访问函数:
| bool | isDefaultUp() const |
| void | setDefaultUp(bool) |
nativeMenuBar : bool
该属性控制在支持菜单栏的平台上,是否将菜单栏作为原生菜单栏使用
该属性指定在支持原生菜单栏的平台上,是否应将该菜单栏作为原生菜单栏使用。当前支持的平台包括 macOS,以及使用 com.canonical.dbusmenu D-Bus 接口的 Linux 桌面系统(例如 Ubuntu Unity)。 如果该属性值为 `true`,则菜单栏将作为原生菜单栏使用,且不会出现在其父窗口中;如果为 `false `,则菜单栏仍保留在窗口中。在其他平台上,设置此属性不会产生任何效果,读取此属性时始终返回 `false`。
默认行为取决于应用程序是否设置了Qt::AA_DontUseNativeMenuBar 属性。显式设置此属性将覆盖该属性的存在(或缺失)状态。
访问函数:
| bool | isNativeMenuBar() const |
| void | setNativeMenuBar(bool nativeMenuBar) |
成员函数文档
[explicit] QMenuBar::QMenuBar(QWidget *parent = nullptr)
使用父对象parent 构建一个菜单栏。
[virtual noexcept] QMenuBar::~QMenuBar()
隐藏菜单栏。
QAction *QMenuBar::actionAt(const QPoint &pt) const
返回pt 上的QAction 。如果pt 上没有相应操作,或者该位置包含分隔符,则返回nullptr 。
另请参阅 QWidget::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::addMenu(QMenu *menu)
将menu 添加到菜单栏中。返回该菜单的menuAction()。菜单栏不会获取该菜单的所有权。
注意: 返回的QAction 对象可用于隐藏相应的菜单。
另请参阅 QWidget::addAction() 和QMenu::menuAction()。
QMenu *QMenuBar::addMenu(const QString &title)
将一个带有title 的新QMenu 添加到菜单栏中。菜单栏将接管该菜单。返回新菜单。
另请参阅 QWidget::addAction() 和QMenu::menuAction()。
QMenu *QMenuBar::addMenu(const QIcon &icon, const QString &title)
将一个包含icon 和title 的新QMenu 添加到菜单栏中。菜单栏将接管该菜单的所有权。返回新的菜单。
另请参阅 QWidget::addAction() 和QMenu::menuAction()。
QAction *QMenuBar::addSeparator()
在菜单后添加一个分隔符。
[override virtual protected] void QMenuBar::changeEvent(QEvent *e)
重写了:QWidget::changeEvent(QEvent *event)。
void QMenuBar::clear()
从菜单栏中移除所有操作。
注意:在 macOS上 ,已合并到系统菜单栏的菜单项不会被此函数移除。处理此问题的一种方法是手动移除多余的操作。您可以在不同的菜单上设置 `menu role `,以便提前了解哪些菜单项会被合并、哪些不会。然后自行决定需要重建或移除哪些内容。
另请参阅 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。
[signal] void QMenuBar::hovered(QAction *action)
当菜单操作被高亮显示时,会发出此信号;action 是触发该事件的操作。
通常,这用于更新状态信息。
另请参阅 triggered() 和QAction::hovered()。
[virtual protected] void QMenuBar::initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const
使用菜单栏中的值以及action 中的信息初始化option 。当子类需要QStyleOptionMenuItem 时,但又不想自己填写所有信息,此方法非常有用。
另请参阅 QStyleOption::initFrom() 和QMenu::initStyleOption()。
QAction *QMenuBar::insertMenu(QAction *before, QMenu *menu)
此便捷函数会在操作 `before ` 之前插入 `menu `,并返回菜单 `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 slot] void QMenuBar::setVisible(bool visible)
重新实现了属性QWidget::visible 的访问函数。
[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 可能会在原生菜单栏上设置委托。如果您需要设置自己的委托,请确保保存原始委托,并将所有调用转发给它。
[signal] void QMenuBar::triggered(QAction *action)
当通过鼠标点击触发了属于此菜单栏的菜单中的某个操作时,会发出此信号;action 即为触发该信号的操作。
通常,您会使用 `QAction::triggered()` 将每个菜单操作连接到一个槽,但有时您可能希望将多个项目连接到一个槽(最常见的情况是用户从数组中进行选择)。在这种情况下,此信号非常有用。
另请参阅 hovered() 和QAction::triggered()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.