主窗口(05):【类】QMenuBar [官翻]

QMenuBar Class

QMenuBar类提供了一个 水平 菜单栏。

Header#include < QMenuBar >
qmakeQT += widgets
InheritsQWidget
Inherited By

详细说明

菜单栏由下拉菜单项列表组成。使用addMenu() 添加菜单项。例如,假设menubar是指向QMenuBar的指针,而fileMenu是指向QMenu的指针,则下面的语句将菜单插入到菜单栏中:

menubar->addMenu(fileMenu);

菜单项文本中的符号将 Alt+F 设置为此菜单的快捷方式。(您可以使用“&&”在菜单栏中获得真正的符号。)

不需要布置菜单栏。它会自动将自己的几何图形设置到父窗口小部件的顶部,并在调整父窗口小部件的大小时对其进行相应的更改。

用法

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

示例(选单示例):

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

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

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

依赖于平台的外观

不同的平台对菜单栏的外观和用户交互时的行为有不同的要求。例如,Windows系统通常被配置为只有在按下Alt键时才显示带下划线的字符助记符,这些助记符指示菜单栏中项目的键盘快捷键。

QMenuBar作为全局菜单栏

在macOS和某些Linux桌面环境(如ubuntuunity)上,QMenuBar是使用系统范围菜单栏的包装器。如果在一个对话框中有多个菜单栏,则最外层的菜单栏(通常在具有小部件标志Qt::Window的小部件内部)将用于系统范围的菜单栏。

qt为macos还提供了一个菜单栏合并功能,使QMenuBar更符合公认的macOS菜单栏布局。合并功能基于与QMenu条目标题匹配的字符串。这些字符串在“QMenuBar”上下文中被翻译(使用QObject::tr() )。如果一个入口被移动了,它的插槽仍然会像在原来的位置一样开火。下表列出了要查找的字符串以及条目的位置(如果匹配):

String matchesPlacementNotes
about.*Application Menu |
About < application name>
应用程序名称是从信息列表文件(见下面的注释)。如果找不到此条目,应用程序菜单中将不会显示“about”项。
config, options, setup, settings or preferencesApplication Menu | Preferences如果找不到此条目,设置项将被禁用
quit or exitApplication Menu | Quit < application name>如果找不到此条目,将创建一个默认的Quit项来调用QCoreApplication::Quit()

您可以使用QAction::menuRole()属性重写此行为。

如果希望Mac应用程序中的所有窗口共享一个菜单栏,则必须创建一个没有父菜单栏的菜单栏。按以下方式创建无父菜单栏:

QMenuBar *menuBar = new QMenuBar(nullptr);

注意:不要调用QMainWindow::menuBar()来创建共享菜单栏,因为该菜单栏将QMainWindow作为其父菜单栏。该菜单栏将仅为父qmain窗口显示。

注意:macOS菜单栏中用于应用程序名称的文本是从信息列表应用程序包中的文件。有关更多信息,请参阅Qt for macOS-Deployment。

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

示例

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

  • Menus Example

属性

  • defaultUp : bool 弹出方向默认向上

    默认情况下,菜单弹出“down”屏幕。通过将属性设置为true,菜单将弹出“up”。对于它们所引用的文档下面的菜单,您可以调用它。

    如果菜单不适合屏幕,则自动使用另一个方向。

    • bool isDefaultUp() const
    • void setDefaultUp(bool)

  • nativeMenuBar : bool 菜单栏是否在支持它的平台上用作本机菜单栏

    此属性指定菜单栏是否应在支持它的平台上用作本机菜单栏。当前支持的平台是macOS和Linux桌面,它们使用com.canonical.dbusmenu D-Bus接口(如ubuntu unity)。如果此属性为true,则菜单栏将在本机菜单栏中使用,而不在其父菜单栏的窗口中;如果为false,则菜单栏将保留在窗口中。在其他平台上,设置此属性无效,读取此属性将始终返回false。

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

    • bool isNativeMenuBar() const
    • void setNativeMenuBar(bool nativeMenuBar)

公共函数

构造和析构

  • QMenuBar(QWidget *parent = nullptr)
  • virtual ~QMenuBar()

属性相关

  • bool isDefaultUp() const
  • void setDefaultUp(bool)
  • bool isNativeMenuBar() const
  • void setNativeMenuBar(bool nativeMenuBar)

当前高亮显示的QAction

  • QAction * activeAction() const
  • void setActiveAction(QAction *act)

增删查清除

  • QRect actionGeometry(QAction *act) const
  • QAction * actionAt(const QPoint &pt) const
  • QAction * addAction(const QString &text)
  • QAction * addAction(const QString &text, const QObject *receiver, const char *member)
  • QAction * addAction(const QString &text, const Obj *receiver, PointerToMemberFunctionOrFunctor method)
  • QAction * addAction(const QString &text, Functor functor)
  • QAction * addMenu(QMenu *menu)
  • QMenu * addMenu(const QString &title)
  • QMenu * addMenu(const QIcon &icon, const QString &title)
  • QAction * insertMenu(QAction *before, QMenu *menu)
  • QAction * addSeparator()
  • QAction * insertSeparator(QAction *before)
  • void clear()

最后的小部件

  • QWidget * cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const
  • void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)

macOS only

  • NSMenu * toNSMenu()

重写的公共函数

  • virtual int heightForWidth(int) const override
  • virtual QSize minimumSizeHint() const override
  • virtual QSize sizeHint() const override

公共槽

  • virtual void setVisible(bool visible) override

信号

  • void hovered(QAction *action)
  • void triggered(QAction *action)

受保护的函数

  • 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

演示代码

#include <QtWidgets>

void setMenuTool(QMainWindow *mw){
    QCommonStyle cs;
    QIcon icon = cs.standardIcon ((QStyle::StandardPixmap)0);
    QAction *newAct = new QAction(icon,"&New", mw);
    newAct->setShortcuts(QKeySequence::New);
    newAct->setStatusTip("Create a new file");

    icon = cs.standardIcon ((QStyle::StandardPixmap)33);
    QAction *openAct = new QAction(icon,"&Open...", mw);
    openAct->setShortcuts(QKeySequence::Open);
    openAct->setStatusTip("Open an existing file");

    QMenu *fileMenu = mw->menuBar()->addMenu("&File");
    fileMenu->addAction(newAct);
    fileMenu->addSeparator();
    fileMenu->addAction(openAct);

    QToolBar *fileToolBar = mw->addToolBar("File");
    fileToolBar->addAction(newAct);
    fileToolBar->addSeparator ();
    fileToolBar->addAction(openAct);
}

int main(int argc, char *argv[])
{

    QApplication a(argc, argv);
    a.setApplicationName ("QMainWindow");
    QMainWindow w;
    setMenuTool(&w);
    QPushButton *corner =new QPushButton("CornerWidget");
    corner->setStyleSheet ("background:yellow");
    w.menuBar ()->setCornerWidget (corner);

    w.statusBar ()->showMessage ("QMainWindow");
    w.resize (350,200);
    w.show();
    return a.exec();
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值