QMenu类

QMenu类提供用于菜单栏、上下文菜单和其他弹出菜单的菜单小部件。更多...

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

属性

公有函数

QMenu(QWidget *parent = nullptr)
QMenu(const QString &title, QWidget *parent = nullptr)
virtual~QMenu()
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 *addSection(const QString &text)
QAction *addSection(const QIcon &icon, const QString &text)
QAction *addSeparator()
voidclear()
QAction *defaultAction() const
QAction *exec()
QAction *exec(const QPoint &p, QAction *action = nullptr)
voidhideTearOffMenu()
QIconicon() 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)
boolisEmpty() const
boolisTearOffEnabled() const
boolisTearOffMenuVisible() const
QAction *menuAction() const
voidpopup(const QPoint &p, QAction *atAction = nullptr)
boolseparatorsCollapsible() const
voidsetActiveAction(QAction *act)
voidsetAsDockMenu()
voidsetDefaultAction(QAction *act)
voidsetIcon(const QIcon &icon)
voidsetSeparatorsCollapsible(bool collapse)
voidsetTearOffEnabled(bool)
voidsetTitle(const QString &title)
voidsetToolTipsVisible(bool visible)
voidshowTearOffMenu(const QPoint &pos)
voidshowTearOffMenu()
QStringtitle() const
NSMenu *toNSMenu()
booltoolTipsVisible() const

重新实现公共函数

virtual QSizesizeHint() const override

信号

voidaboutToHide()
voidaboutToShow()
voidhovered(QAction *action)
voidtriggered(QAction *action)

静态公共成员

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

受保护函数

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

重新实现受保护函数

virtual voidactionEvent(QActionEvent *e) override
virtual voidchangeEvent(QEvent *e) override
virtual voidenterEvent(QEnterEvent *) override
virtual boolevent(QEvent *e) override
virtual boolfocusNextPrevChild(bool next) override
virtual voidhideEvent(QHideEvent *) 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 voidtimerEvent(QTimerEvent *e) override
virtual voidwheelEvent(QWheelEvent *e) override

详细描述

菜单小部件是一个选择菜单。它可以是一个菜单栏中的下拉菜单或独立的上下文菜单。下拉菜单在用户点击相关项或按指定的快捷键时由菜单栏显示。使用 QMenuBar::addMenu() 将菜单插入菜单栏。上下文菜单通常由某些特殊的键盘键或通过右键单击引发。它们可以异步执行 popup() 或同步执行 exec()。菜单也可以在按钮按下时被调用;这些就像上下文菜单一样,只是调用方式不同。

动作

菜单包含一系列动作项。动作项可以通过 `addAction()`、addActions() 和 insertAction() 函数添加。动作项以垂直形式呈现,并由 QStyle 渲染。此外,动作项可以包含文本标签、位于最左侧的可选图标以及如 "Ctrl+X" 这样的快捷键序列。

可以通过 actions() 找到菜单现有的动作项。

动作项有四种类型:分隔符、显示子菜单的动作、控件以及执行动作的动作。分隔符可通过 addSeparator() 插入,子菜单可通过 addMenu() 插入,其余项目均视为动作项。

插入动作项时通常需要指定接收者和槽。当项目被触发时,接收者将被通知。此外,QMenu 提供两个信号,triggered() 和 hovered(),用于指示由菜单触发的 QAction

使用 clear() 清除菜单,并使用 removeAction() 移除单个动作项。

QMenu 还可以提供可撕裂的菜单。可撕裂的菜单是一个包含菜单副本的顶级窗口。这使得用户能够将常用的菜单“撕裂”并放置在屏幕上的方便位置。如果想要某个特定菜单具有此功能,请使用 setTearOffEnabled() 插入可撕裂的处理。在使用可撕裂菜单时,请注意,在微软 Windows 上这种用法不常见,因此一些用户可能不熟悉它。考虑使用 QToolBar 代替。

可以通过 QWidgetAction 类将控件插入到菜单中。该类的实例用于保存控件,并使用带有一个 QAction 的 `addAction()` 重载将它们插入到菜单中。如果 QWidgetAction 触发 triggered() 信号,菜单将关闭。

警告:为了让 QMenu 在屏幕上可见,应使用 exec() 或 popup() 而不是 show() 或 setVisible()。要关闭或禁用在菜单栏中的菜单,或将其添加为子菜单的菜单,请使用 menuAction() 的相应属性。

在使用 Qt 针对 Cocoa 构建的 macOS 上的 QMenu

QMenu 只能在一个菜单/菜单栏中插入一次。后续的插入将不会有任何效果或者将导致菜单项失效。

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

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

另请参阅:QMenuBar菜单示例

属性文档

icon : QIcon

此属性包含菜单的图标

这相当于 QAction::icon 属性的 menuAction()。

默认情况下,如果没有显式设置图标,此属性包含一个空图标。

访问函数

QIconicon() const
voidsetIcon(const QIcon &icon)

separatorsCollapsible : bool

此属性持有连续的分隔符是否应折叠

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

默认情况下,此属性为 true

访问函数

boolseparatorsCollapsible() const
voidsetSeparatorsCollapsible(bool collapse)

tearOffEnabled : bool

此属性持有菜单是否支持分离

当为真时,菜单包含一个特殊的分离项(通常在菜单顶部显示为虚线),当触发时创建菜单的副本。

"分离"的副本生活在单独的窗口中。它包含与原始菜单相同的菜单项,除了分离手柄。

默认情况下,此属性为 false

访问函数

boolisTearOffEnabled() const
voidsetTearOffEnabled(bool)

title : QString

此属性持有菜单的标题

这与 QAction::textmenuAction 属性等效。

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

访问函数

QStringtitle() const
voidsetTitle(const QString &title)

toolTipsVisible : bool

此属性持有菜单操作的工具提示是否应可见

此属性指定操作菜单条目是否显示其工具提示。

默认情况下,此属性为 false

访问函数

booltoolTipsVisible() const
voidsetToolTipsVisible(bool visible)

成员函数文档

[显式] QMenu::QMenu(QWidget *parent = nullptr)

构建一个具有父级 parent 的菜单。

尽管弹出式菜单始终是顶级小部件,但如果提供了一个父级,弹出式菜单将在父级被销毁时被删除(与其他任何 QObject 一样)。

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

构建一个具有 titleparent 的菜单。

尽管弹出式菜单始终是顶级小部件,但如果提供了一个父级,弹出式菜单将在父级被销毁时被删除(与其他任何 QObject 一样)。

另请参阅title

[虚:notexcept] QMenu::~QMenu()

销毁菜单。

[信号] void QMenu::aboutToHide()

此信号在菜单从用户那里隐藏之前发出。

另请参阅aboutToShow() 和 hide

[信号] void QMenu::aboutToShow()

此信号在菜单将向用户显示之前发出。

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

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

返回pt处的项;如果没有项存在,则返回nullptr

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

将带有title的新QMenu附加到菜单中。此菜单将拥有新菜单。返回新菜单。

也请参阅 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的动作,同时具有文本图标提示,并将这个新动作添加到该菜单的动作列表中。它返回新创建的动作。

提示的渲染受样式和平台的影响。小部件样式可以使用部分的文本和图标信息进行渲染,也可以选择忽略它们,并像简单的分隔符一样渲染部分。

QMenu将拥有返回的QAction

也请参阅 QWidget::addAction

QAction *QMenu::addSeparator()

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

QMenu将拥有返回的QAction

也请参阅 QWidget::addAction

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

重写到: QWidget::changeEvent(QEvent *event).

void QMenu::clear()

移除所有菜单动作。属于菜单且未显示在任何其他小部件中的动作将被删除。

另请参阅removeAction().

[保护] int QMenu::columnCount() const

如果菜单未适屏幕,它会自行布局使其适应。布局的含义取决于样式(例如,在Windows上,它将使用多列)。

此函数返回所需列数。

QAction *QMenu::defaultAction() const

返回当前默认动作。

另请参阅setDefaultAction().

[覆盖虚保护] void QMenu::enterEvent(QEnterEvent *)

重写到: QWidget::enterEvent(QEnterEvent *event).

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

重写到: QWidget::event(QEvent *event).

QAction *QMenu::exec()

同步执行此菜单。

这相当于exec(pos())

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

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

exec(QCursor::pos());

或与widgets对齐

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());

或与widgets对齐

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

或响应QMouseEvent *e

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

当使用exec()或popup()定位菜单时,请注意,您不能依赖于菜单当前的你size()。出于性能考虑,菜单仅在实际需要时调整其大小。因此,在许多情况下,显示前后的尺寸不同。相反,请使用sizeHint(),它会根据菜单的当前内容计算出适当的大小。

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

[静态] 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

[重写虚拟受保护] bool QMenu::focusNextPrevChild(bool next)

重写: QWidget::focusNextPrevChild(bool next).

[重写虚拟受保护] void QMenu::hideEvent(QHideEvent *)

重写: QWidget::hideEvent(QHideEvent *event).

void QMenu::hideTearOffMenu()

此函数将强制隐藏分叉菜单,使其从用户桌面上消失。

另请参阅showTearOffMenu(),isTearOffMenuVisible(),以及isTearOffEnabled

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

当菜单操作被高亮显示时发出此信号;action是发出信号的动作用于操作。

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

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

[虚拟保护] 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()为真的操作,但同时也具有text提示。该函数将新创建的操作插入到菜单的操作列表中,在操作before之前,并返回它。

提示的渲染依赖于样式和平台。小部件样式可以使用渲染中的文本信息来渲染部分,或者可以选择忽略它并以类似于简单的分隔符的方式渲染部分。

QMenu将拥有返回的QAction

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

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

此便捷函数创建一个新的标题操作,即返回QAction::isSeparator()为真的操作,但同时也具有texticon提示。该函数将新创建的操作插入到本菜单的操作列表中,在操作before之前,并返回它。

提示的渲染受样式和平台的影响。小部件样式可以使用部分的文本和图标信息进行渲染,也可以选择忽略它们,并像简单的分隔符一样渲染部分。

QMenu将拥有返回的QAction

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

QAction *QMenu::insertSeparator(QAction *before)

此便捷函数创建一个新分隔符操作,即返回QAction::isSeparator()为真的操作。该函数将新创建的操作插入到本菜单的操作列表中,在操作before之前,并返回它。

QMenu将拥有返回的QAction

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

bool QMenu::isEmpty() const

如果没有操作被插入到菜单中,则返回true,否则返回false

另请参阅:QWidget::actions

bool QMenu::isTearOffMenuVisible() const

当一个菜单从原始位置移出时,会显示第二个菜单来显示菜单内容的新窗口。当菜单处于此模式且可见时,返回true;否则返回false

参见 showTearOffMenu(),hideTearOffMenu(),和isTearOffEnabled()。

[重写虚受保护] void QMenu::keyPressEvent(QKeyEvent *e)

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

[重写虚受保护] void QMenu::leaveEvent(QEvent *)

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

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

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

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

[重写虚受保护] void QMenu::mouseMoveEvent(QMouseEvent *e)

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

[重写虚受保护] void QMenu::mousePressEvent(QMouseEvent *e)

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

[重写虚受保护] void QMenu::mouseReleaseEvent(QMouseEvent *e)

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

[重写虚受保护] 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()

设置该菜单为可通过在应用 dock 图标上按选项键来访问的 dock 菜单。仅在 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

[覆盖虚函数] QSize QMenu::sizeHint() const

重新实现了属性访问功能:QWidget::sizeHint

[覆盖虚保护函数] void QMenu::timerEvent(QTimerEvent *)

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

NSMenu *QMenu::toNSMenu()

返回此菜单的原生 NSMenu。仅在 macOS 上可用。

注意:Qt 在原生菜单上设置了代理。如果您需要设置自己的代理,请确保保存原始代理并转发所有调用。

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

当此菜单中的某个操作被触发时,会发出此信号。

action 是触发信号的动作。

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

注意:此信号在层次结构中的主父菜单中发出。因此,只需将父菜单连接到槽即可;子菜单无需连接。

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

[覆盖虚保护函数] void QMenu::wheelEvent(QWheelEvent *e)

重新实现了:QWidget::wheelEvent(QWheelEvent *event)。

© 2024 The Qt Company Ltd. 本文档中包含的文档贡献归各自所有者所有。提供的文档受自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款许可。