QMenuBar类

QMenuBar类提供水平菜单栏。更多信息...

头文件 #include <QMenuBar>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承 QWidget

属性

公共函数

QMenuBar(QWidget *parent = nullptr)
virtual~QMenuBar()
QAction *actionAt(const QPoint &pt) const
QRectactionGeometry(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()
voidclear()
QWidget *cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const
QAction *insertMenu(QAction *before, QMenu *menu)
QAction *insertSeparator(QAction *before)
boolisDefaultUp() const
boolisNativeMenuBar() const
voidsetActiveAction(QAction *act)
voidsetCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)
voidsetDefaultUp(bool)
voidsetNativeMenuBar(bool nativeMenuBar)
NSMenu *toNSMenu()

重实现公共函数

virtual intheightForWidth(int) const override
virtual QSizeminimumSizeHint() const override
virtual QSizesizeHint() const override

公共槽

virtual voidsetVisible(bool visible) override

信号

voidhovered(QAction *action)
voidtriggered(QAction *action)

保护函数

virtual voidinitStyleOption(QStyleOptionMenuItem *option, const QAction *action) const

重实现保护函数

virtual voidactionEvent(QActionEvent *e) override
virtual voidchangeEvent(QEvent *e) override
virtual boolevent(QEvent *e) override
virtual booleventFilter(QObject *object, QEvent *event) override
virtual voidfocusInEvent(QFocusEvent *) override
virtual voidfocusOutEvent(QFocusEvent *) override
virtual voidkeyPressEvent(QKeyEvent *e) override
virtual voidleaveEvent(QEvent *) override
virtual voidmouseMoveEvent(QMouseEvent *e) override
virtual voidmousePressEvent(QMouseEvent *e) override
virtual voidmouseReleaseEvent(QMouseEvent *e) override
virtual voidpaintEvent(QPaintEvent *e) override
virtual voidresizeEvent(QResizeEvent *) override
virtual voidtimerEvent(QTimerEvent *e) override

详细描述

菜单栏由一组下拉菜单项组成。您可以使用 addMenu() 添加菜单项。例如,假设 menubar 是一个指向 QMenuBar 的指针,而 fileMenu 是一个指向 QMenu 的指针,以下语句将菜单添加到菜单栏中

menubar->addMenu(fileMenu);

菜单项文本中的下划线设置 Alt+F 作为该菜单的快捷键。(您可以使用 "&&" 在菜单栏中获取真正的 ampersand。)

不需要对菜单栏进行布局。它自动将其几何形状设置为父窗口的顶部,并且在父窗口大小改变时相应地更改。

用法

在大多数主窗口样式应用程序中,您会使用 menuBar() 函数,该函数由 QMainWindow 提供,将 QMenu 添加到菜单栏,并将 QAction 添加到弹出式菜单。

示例(来自 菜单 示例)

    fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(newAct);

可以使用 removeAction() 删除菜单项。

可以使用 QWidgetAction 类的实例来添加小部件到菜单中。这些操作可以按常规方式插入到菜单中;有关更多详细信息,请参阅 QMenu 文档。

平台依赖的外观和感觉

不同的平台对菜单栏的外观及其用户交互行为有不同的要求。例如,Windows 系统通常配置为仅在按下 Alt 键时显示菜单栏中项的键盘快捷键的下划线字符记法。

QMenuBar 作为全局菜单栏

在 macOS 上以及在某些 Linux 桌面环境(如 Ubuntu Unity)中,QMenuBar 是用于系统级菜单栏的包装器。如果您在一个对话框中有一个以上的菜单栏,则最外层的菜单栏(通常位于具有 widget 标志 Qt::Window 的小部件中)将被用作系统级菜单栏。

Qt for macOS 还提供了菜单栏合并功能,使 QMenuBar 更符合 macOS 菜单栏布局的预期。如果移动条目,其插槽将执行与它在原始位置时的同样的动作。

合并功能基于菜单项的 QAction::menuRole()。如果一个项具有 QAction::TextHeuristicRole,角色将通过以下启发式方法匹配标题字符串来决定:

字符串匹配位置注意
about.*应用程序菜单 | 关于 <应用程序名称>应用程序名称从 Info.plist 文件中获取(见下文说明)。如果此条目未找到,则应用程序菜单中不会显示“关于”项。
config, options, setup, settings 或 preferences应用程序菜单 | 首选项如果未找到此条目,则配置项将被禁用
退出或退出应用程序菜单 | 退出 <应用程序名称>如果未找到此条目,将创建一个默认的退出项来调用 QCoreApplication::quit()

您可以通过将 QAction::menuRole() 属性设置为 QAction::NoRole 来覆盖此行为。

如果您希望在 macOS 应用程序的所有窗口中共享一个菜单栏,您必须创建一个没有父项的菜单栏。通过以下方式创建无父项的菜单栏:

QMenuBar *menuBar = new QMenuBar(nullptr);

注意: 不要使用 QMainWindow::menuBar() 调用创建共享菜单栏,因为这个菜单栏将以 QMainWindow 作为其父项。那个菜单栏只会显示在父 QMainWindow 中。

注意: macOS 菜单栏中用于应用程序名称的文本是从应用程序包中的 Info.plist 文件中设置的值获得的。有关更多信息,请参阅 Qt for macOS - Deployment

注意: 在 Linux 上,如果 D-Bus 会话总线上的 com.canonical.AppMenu.Registrar 服务可用,则 Qt 将与其通信,将应用程序的菜单安装到全局菜单栏,如所述。

示例

菜单 示例演示了如何使用 QMenuBar 和 QMenu。其他 主窗口应用程序示例 也使用这些类提供菜单。

另请参阅: QMenuQShortcutQAction苹果人机界面指南简介菜单示例

属性文档

defaultUp : bool

此属性保持弹出方向

默认的弹出方向。默认情况下,菜单从屏幕底部弹出。将属性设置为 true,则菜单将从顶部弹出。您可能需要为此指向文档底部菜单的情况调用。

如果菜单无法适应屏幕,则将自动使用另一个方向。

访问函数

boolisDefaultUp() const
voidsetDefaultUp(bool)

nativeMenuBar : bool

此属性表示是否在支持的平台上将菜单栏用作原生菜单栏

该属性指定是否应将菜单栏作为本地菜单栏用于支持该功能的平台。目前支持的平台包括macOS和Linux桌面(如Ubuntu Unity,使用com.canonical.dbusmenu D-Bus界面)。如果此属性值为true,则菜单栏将在本地菜单栏中使用,不在其父窗口中;如果false,则菜单栏将保留在窗口中。在其他平台上,设置此属性不会有任何效果,读取此属性总是会返回false

默认情况下,是否遵循应用程序是否设置了Qt::AA_DontUseNativeMenuBar属性。显式设置此属性将覆盖属性的(或不存在)情况。

访问函数

boolisNativeMenuBar() const
voidsetNativeMenuBar(bool nativeMenuBar)

成员函数文档

[explicit] QMenuBar::QMenuBar(QWidget *parent = nullptr)

构建一个带有父项parent的菜单栏。

[虚拟确保无异常] QMenuBar::~QMenuBar()

销毁菜单栏。

QAction *QMenuBar::actionAt(const QPoint &pt) const

pt处返回QAction。如果没有在pt处找到动作或当前位置有分隔符,则返回nullptr

另请参阅QWidget::addAction()和addSeparator()。

[重载虚拟受保护的] void QMenuBar::actionEvent(QActionEvent *e)

重新实现:QWidget::actionEvent(QActionEvent *event)。

QRect QMenuBar::actionGeometry(QAction *act) const

QRect形式返回动作act的几何形状。

另请参阅actionAt()。

QAction *QMenuBar::activeAction() const

返回当前突出显示的QAction,如果没有就返回nullptr

另请参阅setActiveAction()。

QMenu *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)

向菜单栏添加一个新的QMenu,该菜单具有图标标题。菜单栏将拥有对该菜单的所有权。返回新的菜单。

另请参阅QWidget::addAction()和QMenu::menuAction()。

QAction *QMenuBar::addSeparator()

向菜单添加一个分隔符。

[覆盖虚拟保护] void QMenuBar::changeEvent(QEvent *e)

重新实现:QWidget::changeEvent(QEvent *event).

void QMenuBar::clear()

从菜单栏中删除所有操作。

注意:在macOS上,此函数不会删除已合并到系统菜单栏的菜单项。一种处理方法是自己删除额外的操作。您可以在不同的菜单上设置菜单角色,以便预先知道哪些菜单项被合并以及哪些没有合并。然后自行决定要重新创建或删除的内容。

另请参阅:removeAction()。

QWidget *QMenuBar::cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const

根据角落返回第一个菜单项左侧或最后一个菜单项右侧的控件。

注意:使用除Qt::TopRightCornerQt::TopLeftCorner之外的角落将导致警告。

另请参阅:setCornerWidget()。

[覆盖虚拟保护] bool QMenuBar::event(QEvent *e)

重新实现:QWidget::event(QEvent *event).

[覆盖虚拟保护] bool QMenuBar::eventFilter(QObject *object, QEvent *event)

重新实现:QObject::eventFilter(QObject *watched, QEvent *event).

[覆盖虚拟保护] void QMenuBar::focusInEvent(QFocusEvent *)

重新实现:QWidget::focusInEvent(QFocusEvent *event).

[覆盖虚拟保护] void QMenuBar::focusOutEvent(QFocusEvent *)

重新实现:QWidget::focusOutEvent(QFocusEvent *event).

[覆盖虚拟] int QMenuBar::heightForWidth(int) const

重新实现:QWidget::heightForWidth(int w) const.

[信号] void QMenuBar::hovered(QAction *action)

当菜单操作被突出显示时,发出此信号;操作是导致事件发送的操作。

这通常用于更新状态信息。

另请参阅triggered() 和 QAction::hovered()。

[虚拟保护] 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()为真的动作。该函数在动作before之前将新创建的动作插入到这个菜单栏的动作列表中,并返回它。

另请参阅QWidget::insertAction() 和 addSeparator()。

[覆盖虚拟保护] void QMenuBar::keyPressEvent(QKeyEvent *e)

重新 实现: QWidget::keyPressEvent(QKeyEvent *event)。

[覆盖虚拟保护] void QMenuBar::leaveEvent(QEvent *)

重新 实现: QWidget::leaveEvent(QEvent *event)。

[覆盖虚拟] QSize QMenuBar::minimumSizeHint() const

重新 实现:属性访问函数:QWidget::minimumSizeHint

[覆盖虚拟保护] void QMenuBar::mouseMoveEvent(QMouseEvent *e)

重新 实现: QWidget::mouseMoveEvent(QMouseEvent *event)。

[覆盖虚拟保护] void QMenuBar::mousePressEvent(QMouseEvent *e)

重新 实现: QWidget::mousePressEvent(QMouseEvent *event)。

[覆盖虚拟保护] void QMenuBar::mouseReleaseEvent(QMouseEvent *e)

重新实现: QWidget::mouseReleaseEvent(QMouseEvent *event).

[重载 虚拟 保护] void QMenuBar::paintEvent(QPaintEvent *e)

重新实现: QWidget::paintEvent(QPaintEvent *event).

[重载 虚拟 保护] 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)

这将根据 corner 将给定的 widget 直接显示在第一个菜单项左侧,或最后一个菜单项右侧。

菜单栏将获取 widget 的所有权,将其重新嵌入到菜单栏中。但是,如果 corner 已经包含了一个组件,此先前的组件将不再被管理,并且仍将是菜单栏可见子组件。

注意:使用除Qt::TopRightCornerQt::TopLeftCorner之外的角落将导致警告。

另请参阅 cornerWidget

[重载 虚拟槽] void QMenuBar::setVisible(bool visible)

重新实现了一个访问属性的函数:QWidget::visible

[重载 虚拟] QSize QMenuBar::sizeHint() const

重新实现了一个访问属性的函数:QWidget::sizeHint

[重载 虚拟 保护] void QMenuBar::timerEvent(QTimerEvent *e)

重新实现: QObject::timerEvent(QTimerEvent *event).

NSMenu *QMenuBar::toNSMenu()

返回此菜单栏的原生 NSMenu。仅适用于 macOS。

注意: Qt 可能会在原生菜单栏上设置委托。如果您需要设置自己的委托,请确保保存原始委托,并将任何调用转发给它。

[信号] void QMenuBar::triggered(QAction *action)

当属于此菜单栏的菜单中的动作因鼠标点击而触发时,发出此信号;action 是发出信号的动作者。

注意: QMenuBar 必须拥有 QMenu 的所有权,以便此信号工作。

通常,您使用 QAction::triggered() 将每个菜单操作连接到一个槽,但有时您可能希望将多个项连接到单个槽(通常情况下是用户从数组中选择时)。此信号在这种情况下非常有用。

另请参阅hovered() 和 QAction::triggered

© 2024 The Qt Company Ltd. 本文件包含的文档贡献是其各自所有者的版权。所提供的文档根据由自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款许可。Qt及其相应标志是芬兰及/或全球其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。