Qt应用开发(基础篇)——菜单栏 QMenuBar

一、前言

QMenuBar 类继承于QWidget ,该类提供了一个水平菜单栏

++菜单栏使用++

QMenuBar 菜单栏,顾名思义是菜单QMenu 和动作QAction 的容器,一般在软件的顶部经常会见到它。菜单栏包含了一系列下拉的菜单,使用addMenu() 函数添加QMenu菜单,使用**addAction()**函数添加QAction动作。菜单栏不需要布局,它会自动将自己的几何图形设置到父类控件的顶部,并在父类控件调整大小同步调整自身。

创建主窗口QMainWindows 样式的程序中,它自带了菜单栏,使用**menuBar()**可以得到菜单栏QMenuBar指针,然后你就可以直接添加QMenu或者QAction,例如:

cpp 复制代码
QAction *newAct = new QAction("copy");
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(newAct);

而QMenu对与文本、图标、小部件和操作action的应用,请参考我另一篇文章,这里就不多介绍了。

菜单 QMenu

cpp 复制代码
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QMenu *menu = new QMenu();                
    QAction *copyAcy =     menu->addAction(QIcon(QApplication::style()->standardIcon(QStyle::SP_DirOpenIcon)),"copy",this,SLOT(onCopyTriggered()),QKeySequence(Qt::CTRL + Qt::Key_C));
    menu->addAction("cut");
    menu->addSeparator();
    QMenu *sub_menu = new QMenu("help");
    menu->addMenu(sub_menu);
    menu->addMenu(sub_menu);
    sub_menu->addAction("about");
    connect(menu,&QMenu::triggered,[=](QAction *action *action){
        if(action == copyAcy)
        {
            qDebug()<<"copy Triggered";
        }
    });
    this->menuBar()->addMenu(menu);
    this->menuBar()->addMenu("编辑(E)");
}
 
void MainWindow::onCopyTriggered()
{
    qDebug()<<"copy Triggered";
}

二、QMenuBar类

1、defaultUp

该属性表示弹窗的方向,默认弹窗是水平向下,如果该属性设置为true,那么弹窗方向将会变成向上弹出。一般只有菜单栏在底下,才会设置该属性。

cpp 复制代码
bool isDefaultUp() const
void setDefaultUp(bool)

2、nativeMenuBar

该属性表示菜单栏是否会在支持它的平台上作为原生菜单栏使用。如果此属性为true,则该菜单栏将在本地菜单栏中使用,而不是在其父窗口中。如果为false,则菜单栏保留在窗口中。目前只有在macOS上生效,如果没有这类系统的需求,就不需要关注了。

cpp 复制代码
bool isNativeMenuBar() const
void setNativeMenuBar(bool nativeMenuBar)

3、公共函数

1)actionAt

返回参数pt位置的的操作action指针,如果不存在或者是分隔符,则返回空指针。

cpp 复制代码
QAction *actionAt(const QPoint &pt) const

2)actionGeometry

返回参数action的矩形QRect。

cpp 复制代码
QRect actionGeometry(QAction *act) const

在上面的示例中我们添加如下代码,这样我们就可以得到某action的触发范围,得到这些信息可以和**actionAt()**配合使用。

cpp 复制代码
this->menuBar()->addMenu("编辑(E)");
QAction *testAct = this->menuBar()->addAction("调试(D)");
qDebug()<<this->menuBar()->actionGeometry(testAct).x()
        <<this->menuBar()->actionGeometry(testAct).y()
        <<this->menuBar()->actionGeometry(testAct).width()
        <<this->menuBar()->actionGeometry(testAct).height();

3)addAction

添加一个动作action,可以直接指定动作触发的时候接收的槽函数,参考上例。

cpp 复制代码
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)

4)addMenu

添加一个菜单menu。

cpp 复制代码
QAction *addMenu(QMenu *menu)
QMenu *addMenu(const QString &title)
QMenu *addMenu(const QIcon &icon, const QString &title)

5)insertMenu

在某个动作action之前插入一个菜单menu。

cpp 复制代码
QAction *insertMenu(QAction *before, QMenu *menu)

6)insertSeparator

在某个动作action之前插入一个分隔符。

cpp 复制代码
QAction *insertSeparator(QAction *before)

7)addSeparator

添加一个分隔符。

cpp 复制代码
 QAction *addSeparator()

8)clear

清除全部的菜单menu和动作action。

cpp 复制代码
void clear()

9)cornerWidget

返回位于第一个菜单项左侧或最后一个菜单项右侧的小部件,具体取决于角落。

cpp 复制代码
QWidget *cornerWidget(Qt::Corner corner = Qt::TopRightCorner) const

10)cornerWidget

将小部件设置为直接显示在第一个菜单项的左侧,或显示在最后一个菜单项的右侧

cpp 复制代码
void setCornerWidget(QWidget *widget, Qt::Corner corner = Qt::TopRightCorner)

在上面的示例中添加一个toolbutton作为角落小部件:

cpp 复制代码
QToolButton *btn = new QToolButton();
btn->setIcon(QIcon(QApplication::style()->standardIcon(QStyle::SP_TitleBarMenuButton)));
this->menuBar()->setCornerWidget(btn,Qt::TopLeftCorner);

11)setActiveAction

设置某一个动作action为激活状态。

cpp 复制代码
void setActiveAction(QAction *act)

4、信号

1)hovered

这个信号在菜单操作被高亮显示时触发,action是导致事件被发送的动作,通常用于更新状态信息。

cpp 复制代码
void hovered(QAction *action)

2)hovered

当鼠标点击触发属于该菜单栏的菜单中的动作时,触发该信号,action是引起信号触发的动作。

注意:QMenuBar必须拥有QMenu的所有权才能使此信号工作。

cpp 复制代码
void triggered(QAction *action)
相关推荐
唐诺3 小时前
几种广泛使用的 C++ 编译器
c++·编译器
mahuifa4 小时前
混合开发环境---使用编程AI辅助开发Qt
人工智能·vscode·qt·qtcreator·编程ai
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客4 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin4 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos5 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室6 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0016 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我586 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc6 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存