QMenuBar类
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 作为该菜单的快捷键。(您可以使用 "&&" 在菜单栏中获取真正的 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 应用程序的所有窗口中共享一个菜单栏,您必须创建一个没有父项的菜单栏。通过以下方式创建无父项的菜单栏:
注意: 不要使用 QMainWindow::menuBar() 调用创建共享菜单栏,因为这个菜单栏将以 QMainWindow 作为其父项。那个菜单栏只会显示在父 QMainWindow 中。
注意: macOS 菜单栏中用于应用程序名称的文本是从应用程序包中的 Info.plist
文件中设置的值获得的。有关更多信息,请参阅 Qt for macOS - Deployment。
注意: 在 Linux 上,如果 D-Bus 会话总线上的 com.canonical.AppMenu.Registrar 服务可用,则 Qt 将与其通信,将应用程序的菜单安装到全局菜单栏,如所述。
示例
另请参阅: QMenu、QShortcut、QAction、苹果人机界面指南简介 和 菜单示例。
属性文档
defaultUp : bool
此属性保持弹出方向
默认的弹出方向。默认情况下,菜单从屏幕底部弹出。将属性设置为 true,则菜单将从顶部弹出。您可能需要为此指向文档底部菜单的情况调用。
如果菜单无法适应屏幕,则将自动使用另一个方向。
访问函数
bool | isDefaultUp() const |
void | setDefaultUp(bool) |
nativeMenuBar : bool
此属性表示是否在支持的平台上将菜单栏用作原生菜单栏
该属性指定是否应将菜单栏作为本地菜单栏用于支持该功能的平台。目前支持的平台包括macOS和Linux桌面(如Ubuntu Unity,使用com.canonical.dbusmenu D-Bus界面)。如果此属性值为true
,则菜单栏将在本地菜单栏中使用,不在其父窗口中;如果false
,则菜单栏将保留在窗口中。在其他平台上,设置此属性不会有任何效果,读取此属性总是会返回false
。
默认情况下,是否遵循应用程序是否设置了Qt::AA_DontUseNativeMenuBar属性。显式设置此属性将覆盖属性的(或不存在)情况。
访问函数
bool | isNativeMenuBar() const |
void | setNativeMenuBar(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::TopRightCorner或Qt::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::TopRightCorner或Qt::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 是发出信号的动作者。
通常,您使用 QAction::triggered() 将每个菜单操作连接到一个槽,但有时您可能希望将多个项连接到单个槽(通常情况下是用户从数组中选择时)。此信号在这种情况下非常有用。
另请参阅hovered() 和 QAction::triggered。
© 2024 The Qt Company Ltd. 本文件包含的文档贡献是其各自所有者的版权。所提供的文档根据由自由软件基金会发布的 GNU自由文档许可证版本1.3 的条款许可。Qt及其相应标志是芬兰及/或全球其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。