QMenu Class

QMenu 类提供了一个菜单部件,可用于菜单栏、上下文菜单和其他弹出式菜单。更多

Header: #include <QMenu>
CMake.QMenu find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
继承: QWidget

属性

公共函数

QMenu(QWidget *parent = nullptr)
QMenu(const QString &title, QWidget *parent = nullptr)
virtual ~QMenu()
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 *addSection(const QString &text)
QAction *addSection(const QIcon &icon, const QString &text)
QAction *addSeparator()
void clear()
QAction *defaultAction() const
QAction *exec()
QAction *exec(const QPoint &p, QAction *action = nullptr)
void hideTearOffMenu()
QIcon icon() const
QAction *insertMenu(QAction *before, QMenu *menu)
QAction *insertSection(QAction *before, const QString &text)
QAction *insertSection(QAction *before, const QIcon &icon, const QString &text)
QAction *insertSeparator(QAction *before)
bool isEmpty() const
bool isTearOffEnabled() const
bool isTearOffMenuVisible() const
QAction *menuAction() const
void popup(const QPoint &p, QAction *atAction = nullptr)
bool separatorsCollapsible() const
void setActiveAction(QAction *act)
void setAsDockMenu()
void setDefaultAction(QAction *act)
void setIcon(const QIcon &icon)
void setSeparatorsCollapsible(bool collapse)
void setTearOffEnabled(bool)
void setTitle(const QString &title)
void setToolTipsVisible(bool visible)
void showTearOffMenu(const QPoint &pos)
void showTearOffMenu()
QString title() const
NSMenu *toNSMenu()
bool toolTipsVisible() const

重新实现的公共函数

virtual QSize sizeHint() const override

信号

void aboutToHide()
void aboutToShow()
void hovered(QAction *action)
void triggered(QAction *action)

静态公共成员

QAction *exec(const QList<QAction *> &actions, const QPoint &pos, QAction *at = nullptr, QWidget *parent = nullptr)
QMenu *menuInAction(const QAction *action)

保护函数

int columnCount() const
virtual void initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const

重新实现的受保护函数

virtual void actionEvent(QActionEvent *e) override
virtual void changeEvent(QEvent *e) override
virtual void enterEvent(QEnterEvent *) override
virtual bool event(QEvent *e) override
virtual bool focusNextPrevChild(bool next) override
virtual void hideEvent(QHideEvent *) 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 timerEvent(QTimerEvent *e) override
virtual void wheelEvent(QWheelEvent *e) override

详细说明

菜单部件是一个选择菜单。它可以是菜单栏中的下拉菜单,也可以是独立的上下文菜单。当用户点击相应的项目或按下指定的快捷键时,菜单栏就会显示下拉菜单。使用QMenuBar::addMenu() 可以在菜单栏中插入菜单。上下文菜单通常通过一些特殊的键盘键或右键单击来调用。它们可以通过popup() 异步执行,也可以通过exec() 同步执行。菜单也可以通过按下按钮来调用;除了调用方式外,它们与上下文菜单一样。

操作

菜单由一系列操作项目组成。可使用 addAction()、addActions() 和insertAction() 函数添加操作。操作以垂直方式表示,并通过QStyle 呈现。此外,操作还可以有一个文本标签、一个绘制在左侧的可选图标和快捷键序列(如 "Ctrl+X")。

菜单中的现有操作可通过actions() 查找。

有四种操作项目:分隔符、显示子菜单的操作、小工具和执行操作的操作。分隔符用addSeparator() 插入,子菜单用addMenu() 插入,所有其他项目都被视为操作项。

插入操作项时,通常要指定一个接收器和一个插槽。每当项目被triggered() 时,接收者就会收到通知。此外,QMenu 还提供了两个信号triggered() 和hovered() ,这两个信号是由菜单触发的QAction

您可以使用clear() 清除菜单,使用removeAction() 删除单个操作项目。

QMenu 还可以提供拆分菜单。拆分菜单是一个包含菜单副本的顶层窗口。这样,用户就可以 "撕下 "常用菜单,并将其放置在屏幕上方便的位置。如果您希望某个菜单具有这种功能,请使用setTearOffEnabled() 插入撕离句柄。在使用撕离菜单时,请注意这一概念通常不用于 Microsoft Windows,因此有些用户可能并不熟悉。请考虑使用QToolBar 代替。

可以使用QWidgetAction 类将小工具插入菜单。该类的实例用于保存窗口小部件,并通过 addAction() 重载插入菜单,该重载需要一个QAction 。如果QWidgetAction 触发triggered() 信号,菜单将关闭。

警告: 要使 QMenu 在屏幕上可见,应使用exec() 或popup() 而不是show() 或setVisible() 。要隐藏或禁用菜单,请使用menuAction() 的相应属性。

使用 Qt Build Against Cocoa 在 macOS 上创建 QMenu

QMenu 只能在菜单/菜单栏中插入一次。后续插入将不起作用或导致菜单项禁用。

有关如何在应用程序中使用QMenuBar 和 QMenu 的示例,请参阅菜单示例。

重要继承函数:addAction()、removeAction( )、clear( )、addSeparator( ) 和addMenu( )。

另请参阅 QMenuBar菜单示例

属性文档

icon : QIcon

该属性包含菜单图标

该属性等同于menuAction() 的QAction::icon 属性。

默认情况下,如果没有明确设置图标,该属性将包含一个空图标。

访问函数:

QIcon icon() const
void setIcon(const QIcon &icon)

separatorsCollapsible : bool

此属性表示是否应折叠连续分隔符

该属性指定菜单中的连续分隔符是否应在视觉上折叠为一个。菜单开头或结尾的分隔符也会被隐藏。

默认情况下,该属性为true

访问功能:

bool separatorsCollapsible() const
void setSeparatorsCollapsible(bool collapse)

tearOffEnabled : bool

该属性表示菜单是否支持撕离

为 true 时,菜单包含一个特殊的 "撕离 "项(通常显示为菜单顶部的虚线),触发后会创建一个菜单副本。

这个 "撕离 "副本位于一个单独的窗口中。它包含与原始菜单相同的菜单项,但撕离句柄除外。

默认情况下,此属性为false

访问功能:

bool isTearOffEnabled() const
void setTearOffEnabled(bool)

title : QString

该属性包含菜单标题

该属性等同于menuAction() 的QAction::text 属性。

默认情况下,该属性包含一个空字符串。

访问功能:

QString title() const
void setTitle(const QString &title)

toolTipsVisible : bool

该属性用于确定菜单操作的工具提示是否可见。

该属性用于指定动作菜单条目是否显示工具提示。

默认情况下,该属性为false

访问函数:

bool toolTipsVisible() const
void setToolTipsVisible(bool visible)

成员函数文档

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

构造一个菜单,其父节点为parent

虽然弹出菜单始终是一个顶级部件,但如果传递了父部件,弹出菜单将在父部件被销毁时被删除(与任何其他QObject )。

[explicit] QMenu::QMenu(const QString &title, QWidget *parent = nullptr)

titleparent 构造一个菜单。

虽然弹出式菜单始终是一个顶层 widget,但如果传递了父级 widget,弹出式菜单将在父级 widget 销毁时被删除(与其他QObject 一样)。

另请参阅 title

[virtual noexcept] QMenu::~QMenu()

销毁菜单。

[signal] void QMenu::aboutToHide()

该信号在菜单从用户面前隐藏之前发出。

另请参阅 aboutToShow() 和hide()。

[signal] void QMenu::aboutToShow()

该信号在菜单显示给用户之前发出。

另请参阅 aboutToHide() 和show()。

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

返回pt 上的项目;如果没有项目,则返回nullptr

[override virtual protected] void QMenu::actionEvent(QActionEvent *e)

重实现:QWidget::actionEvent(QActionEvent *event).

QRect QMenu::actionGeometry(QAction *act) const

返回动作的几何图形act

QAction *QMenu::activeAction() const

返回当前高亮显示的操作,如果当前没有高亮显示的操作,则返回nullptr

另请参阅 setActiveAction().

QAction *QMenu::addMenu(QMenu *menu)

该便捷函数将menu 添加为该菜单的子菜单。它返回menumenuAction() 。本菜单不拥有menu 的所有权。

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

QMenu *QMenu::addMenu(const QString &title)

在菜单中添加一个新的QMenu title 。菜单拥有该菜单的所有权。返回新菜单。

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

QMenu *QMenu::addMenu(const QIcon &icon, const QString &title)

将包含icontitle 的新QMenu 附加到菜单。菜单拥有该菜单的所有权。返回新菜单。

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

QAction *QMenu::addSection(const QString &text)

此便捷函数创建一个新的部分操作,即QAction::isSeparator() 返回 true 但也有text 提示的操作,并将新操作添加到此菜单的操作列表中。它将返回新创建的操作。

提示的呈现取决于样式和平台。小工具样式可以在分区渲染中使用文本信息,也可以选择忽略文本信息,将分区渲染为简单的分隔符。

QMenu 获取返回的 的所有权。QAction

另请参见 QWidget::addAction().

QAction *QMenu::addSection(const QIcon &icon, const QString &text)

此便捷函数创建一个新的部分操作,即一个QAction::isSeparator() 返回 true 但也有texticon 提示的操作,并将新操作添加到此菜单的操作列表中。它会返回新创建的操作。

提示的呈现取决于样式和平台。小工具样式可以在分区渲染中使用文本和图标信息,也可以选择忽略它们,将分区渲染为简单的分隔符。

QMenu 获取返回的 的所有权。QAction

另请参阅 QWidget::addAction() 。

QAction *QMenu::addSeparator()

此便捷函数创建一个新的分隔符动作,即QAction::isSeparator() 返回 true 的动作,并将新动作添加到菜单的动作列表中。它将返回新创建的操作。

QMenu 返回的 拥有所有权。QAction

另请参阅 QWidget::addAction()。

[override virtual protected] void QMenu::changeEvent(QEvent *e)

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

void QMenu::clear()

删除菜单的所有操作。菜单所有且未在任何其他 widget 中显示的操作将被删除。

另请参见 removeAction()。

[protected] int QMenu::columnCount() const

如果菜单不适合显示在屏幕上,它就会自行布局,使其适合显示。布局的含义与样式有关(例如,在 Windows 上会使用多列)。

该函数将返回所需的列数。

QAction *QMenu::defaultAction() const

返回当前默认操作。

另请参阅 setDefaultAction()。

[override virtual protected] void QMenu::enterEvent(QEnterEvent *)

重实现:QWidget::enterEvent(QEnterEvent *event).

[override virtual protected] bool QMenu::event(QEvent *e)

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

QAction *QMenu::exec()

同步执行该菜单。

这相当于exec(pos())

这将返回弹出菜单或其子菜单中触发的QAction ,如果没有项目被触发(通常是因为用户按了 Esc 键),则返回nullptr

在大多数情况下,您需要自己指定位置,例如当前鼠标位置:

exec(QCursor::pos());

或与部件对齐:

exec(somewidget.mapToGlobal(QPoint(0,0)));

或对QMouseEvent *e:

exec(e->globalPosition().toPoint());

QAction *QMenu::exec(const QPoint &p, QAction *action = nullptr)

这是一个重载函数。

同步执行该菜单。

弹出菜单后,操作action 将位于指定的全局位置p 。要将部件的本地坐标转换为全局坐标,请使用QWidget::mapToGlobal() 。

这将返回弹出菜单或其子菜单中触发的QAction ,如果没有项目被触发(通常是因为用户按了 Esc 键),则返回nullptr

请注意,所有信号都将照常发出。如果将QAction 连接到插槽并调用菜单的 exec(),则可以通过信号-插槽连接和 exec() 的返回值获得结果。

通常的用法是将菜单定位在当前鼠标位置:

exec(QCursor::pos());

或与部件对齐:

exec(somewidget.mapToGlobal(QPoint(0, 0)));

或对QMouseEvent *e 作出反应:

exec(e->globalPosition().toPoint());

在使用 exec() 或popup() 定位菜单时,请注意不能依赖菜单当前的size()。出于性能考虑,菜单只会在必要时调整其大小。因此在很多情况下,显示前后的大小是不同的。相反,使用sizeHint() 可以根据菜单的当前内容计算出合适的大小。

另请参阅 popup() 和QWidget::mapToGlobal()。

[static] QAction *QMenu::exec(const QList<QAction *> &actions, const QPoint &pos, QAction *at = nullptr, QWidget *parent = nullptr)

这是一个重载函数。

同步执行菜单。

菜单的操作由actions 的列表指定。菜单弹出后,指定的操作at 将出现在全局位置pos 。如果未指定at ,则菜单会出现在pos 的位置。parent 是菜单的父部件;当仅靠pos 无法决定菜单的位置时(例如,在多个桌面或父部件嵌入QGraphicsView 时),指定父部件将提供上下文信息。

该函数返回弹出菜单或其子菜单中触发的QAction ,如果没有项目被触发(通常是因为用户按了 Esc 键),则返回nullptr

这相当于

QMenu menu;
QAction *at = actions[0]; // Assumes actions is not empty
for (QAction *a : std::as_const(actions))
    menu.addAction(a);
menu.exec(pos, at);

另请参见 popup() 和QWidget::mapToGlobal()。

[override virtual protected] bool QMenu::focusNextPrevChild(bool next)

重实现:QWidget::focusNextPrevChild(bool next)。

[override virtual protected] void QMenu::hideEvent(QHideEvent *)

重实现:QWidget::hideEvent(QHideEvent *event).

void QMenu::hideTearOffMenu()

该功能将强制隐藏被撕掉的菜单,使其从用户桌面上消失。

另请参阅 showTearOffMenu()、isTearOffMenuVisible() 和isTearOffEnabled()。

[signal] void QMenu::hovered(QAction *action)

当菜单操作被高亮显示时,就会发出该信号;action 是导致信号发出的操作。

通常用于更新状态信息。

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

[virtual protected] void QMenu::initStyleOption(QStyleOptionMenuItem *option, const QAction *action) const

使用本菜单中的值和action 中的信息初始化option 。当子类需要QStyleOptionMenuItem ,但又不想自己填写所有信息时,该方法非常有用。

另请参阅 QStyleOption::initFrom() 和QMenuBar::initStyleOption()。

QAction *QMenu::insertMenu(QAction *before, QMenu *menu)

该便捷函数在操作before 之前插入menu ,并返回菜单menuAction() 。

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

QAction *QMenu::insertSection(QAction *before, const QString &text)

该便捷函数用于创建一个新的标题操作,即一个QAction::isSeparator() 返回 true 但同时具有text 提示的操作。该函数将新创建的操作插入before 之前的菜单操作列表,然后返回。

提示的呈现取决于样式和平台。小工具样式可以在显示部分时使用文本信息,也可以选择忽略文本信息,将部分显示为简单的分隔符。

QMenu 获取返回的 的所有权。QAction

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

QAction *QMenu::insertSection(QAction *before, const QIcon &icon, const QString &text)

该便捷函数用于创建一个新的标题操作,即一个QAction::isSeparator() 返回 true 但同时具有texticon 提示的操作。该函数将新创建的操作插入before 之前的菜单操作列表,然后返回。

提示的呈现取决于样式和平台。小工具样式可以在分区渲染中使用文本和图标信息,也可以选择忽略这些信息,将分区渲染为简单的分隔符。

QMenu 获取返回的 的所有权。QAction

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

QAction *QMenu::insertSeparator(QAction *before)

该函数用于创建新的分隔符操作,即QAction::isSeparator() 返回 true 的操作。该函数将新创建的操作插入before 之前的菜单操作列表中,并将其返回。

QMenu 将获得返回的 的所有权。QAction

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

bool QMenu::isEmpty() const

如果菜单中没有插入可见操作,则返回true ,否则返回 false。

另请参阅 QWidget::actions().

bool QMenu::isTearOffMenuVisible() const

当菜单被撕下时,会显示第二个菜单,在新窗口中显示菜单内容。当菜单处于此模式且菜单可见时,返回true ;否则返回 false。

另请参阅 showTearOffMenu()、hideTearOffMenu() 和isTearOffEnabled()。

[override virtual protected] void QMenu::keyPressEvent(QKeyEvent *e)

重实现:QWidget::keyPressEvent(QKeyEvent *event).

[override virtual protected] void QMenu::leaveEvent(QEvent *)

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

返回与该菜单相关的操作。

返回action 包含的菜单,如果action 不包含菜单,则返回nullptr

在 widget 应用程序中,包含菜单的操作可用于创建带子菜单的菜单项,或插入工具栏以创建带弹出菜单的按钮。

[override virtual protected] void QMenu::mouseMoveEvent(QMouseEvent *e)

重实现:QWidget::mouseMoveEvent(QMouseEvent *event).

[override virtual protected] void QMenu::mousePressEvent(QMouseEvent *e)

重实现:QWidget::mousePressEvent(QMouseEvent *event).

[override virtual protected] void QMenu::mouseReleaseEvent(QMouseEvent *e)

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

[override virtual protected] void QMenu::paintEvent(QPaintEvent *e)

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

显示菜单,使操作atAction 位于指定的全局位置p 。要将部件的本地坐标转换为全局坐标,请使用QWidget::mapToGlobal() 。

使用exec() 或 popup() 定位菜单时,请注意不能依赖菜单当前的size()。出于性能考虑,菜单仅在必要时调整其大小,因此在很多情况下,显示前后的大小是不同的。取而代之的是使用sizeHint() ,它会根据菜单的当前内容计算合适的大小。

另请参阅 QWidget::mapToGlobal() 和exec()。

void QMenu::setActiveAction(QAction *act)

将当前高亮显示的操作设置为act

另请参阅 activeAction() 。

void QMenu::setAsDockMenu()

将此菜单设置为可通过选项单击应用程序停靠图标获得的停靠菜单。仅适用于 macOS。

void QMenu::setDefaultAction(QAction *act)

这会将默认操作设置为act 。默认操作可能有视觉提示,具体取决于当前的QStyle 。默认操作通常表示当发生下拉时默认会发生什么。

另请参阅 defaultAction() 。

void QMenu::showTearOffMenu(const QPoint &pos)

该函数将强制显示撕下的菜单,使其出现在用户桌面上指定的全局位置pos

另请参阅 hideTearOffMenu()、isTearOffMenuVisible() 和isTearOffEnabled()。

void QMenu::showTearOffMenu()

这是一个重载函数。

该函数将强制显示被撕掉的菜单,使其显示在用户桌面的鼠标指针下。

另请参见 hideTearOffMenu()、isTearOffMenuVisible() 和isTearOffEnabled()。

[override virtual] QSize QMenu::sizeHint() const

重构属性访问函数:QWidget::sizeHint

[override virtual protected] void QMenu::timerEvent(QTimerEvent *e)

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

NSMenu *QMenu::toNSMenu()

返回此菜单的本地 NSMenu。仅适用于 macOS。

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

[signal] void QMenu::triggered(QAction *action)

当该菜单中的操作被触发时会发出该信号。

action 是触发信号的动作。

通常,您会将每个菜单操作的triggered() 信号连接到各自的自定义槽,但有时您会希望将多个操作连接到一个槽,例如,当您有一组密切相关的操作时,如 "左对齐"、"居中"、"右对齐"。

注意: 该信号是针对层次结构中的主父菜单发出的。因此,只有父菜单需要连接到插槽,子菜单无需连接。

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

[override virtual protected] void QMenu::wheelEvent(QWheelEvent *e)

重实现:QWidget::wheelEvent(QWheelEvent *event).

© 2025 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.