Qt窗口——QMenuBar

文章目录

QMenuBar

Qt中采用QMenuBar来创建菜单栏,一个主窗口,只允许有一个菜单栏,位于主窗口的顶部、主窗口标题栏下面;一个菜单栏里面有多个菜单QMenu;菜单里面有菜单项QAction

QAction不仅仅在菜单里使用,还在工具栏里使用,工具栏的本质,就是菜单中一些选项的"快捷方式"

示例演示

创建一个餐单栏,添加菜单,给菜单添加菜单项

创建工程的时候选择的是QMainWindow了,因为要创建窗口

ui界面:

这里有一个Bug,就是在ui界面设置菜单项的时候,中文无法输入(可以通过复制粘贴),这有点麻烦

代码创建:

关于QMenuBar的创建方式:

cpp 复制代码
QMenuBar* menuBar = new QMenuBar();
this->setMenuBar(menuBar);

如果在创建项目的时候,没有勾选自动创建ui文件,上述代码没问题;

如果勾选了自动生成ui文件,就会造成内存泄漏,因为我们这个操作会代替旧的menubar,旧的没有释放。

cpp 复制代码
QMenuBar* menuBar = this->menuBar();
this->setMenuBar(menuBar);

QMenuBar* menuBar = this->menuBar();表示如果QMenuBar()存在,则直接获取;如果不存在,就创建一个新的再返回

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //创建菜单栏
    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);  //添加到对象树

    //创建菜单
    QMenu* menu1 = new QMenu("文件");
    QMenu* menu2 = new QMenu("编辑");
    QMenu* menu3 = new QMenu("构建");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

    //添加菜单项
    QAction* action1 = new QAction("新建");
    QAction* action2 = new QAction("打开");
    QAction* action3 = new QAction("关闭");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);
    
    //添加信号槽
    connect(action1, &QAction::trigger, this, &MainWindow::handle);
    connect(action3, &QAction::trigger, this, &MainWindow::close);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handle()
{
    qDebug() << "触发新建操作";
}

菜单项被点击的时候,会触发一个信号triggered,可以设置对应的槽函数,来响应操作

给菜单栏设置快捷键

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    
    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);
    
    QMenu* menu1 = new QMenu("文件(&F)");
    QMenu* menu2 = new QMenu("编辑(&E)");
    QMenu* menu3 = new QMenu("构建(&B)");
    QMenu* menu4 = new QMenu("调试(&D)");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);
    menuBar->addMenu(menu4);
    
    QAction* action1 = new QAction("新建");
    QAction* action2 = new QAction("撤销");
    QAction* action3 = new QAction("构建项目");
    QAction* action4 = new QAction("开始调试");
    
    menu1->addAction(action1);
    menu2->addAction(action2);
    menu3->addAction(action3);
    menu4->addAction(action4);
}

MainWindow::~MainWindow()
{
    delete ui;
}

这里构建的时候直接加上& 键位即可,然后就可以通过alt + 键位触发

和给QLabel设置伙伴类似

给菜单项设置快捷键

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

    QMenu* menu1 = new QMenu("文件(&F)");
    QMenu* menu2 = new QMenu("编辑(&E)");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);

    QAction* action1 = new QAction("新建(&N)");
    QAction* action2 = new QAction("打开(&O)");
    QAction* action3 = new QAction("撤销(&Z)");

    menu1->addAction(action1);
    menu1->addAction(action2);
    menu2->addAction(action3);

    connect(action1, &QAction::triggered, this, &MainWindow::handle1);
    connect(action2, &QAction::triggered, this, &MainWindow::handle2);
    connect(action3, &QAction::triggered, this, &MainWindow::handle3);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::handle1()
{
    qDebug() << "新建";
}

void MainWindow::handle2()
{
    qDebug() << "打开";
}

void MainWindow::handle3()
{
    qDebug() << "撤销";
}

添加子菜单

QMenu也提供了addMenu,给菜单项添加子菜单

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);

    QMenu* menu1 = new QMenu("父菜单");
    QMenu* menu1_1 = new QMenu("子菜单");
    menuBar->addMenu(menu1);
    menu1->addMenu(menu1_1);

    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    menu1_1->addAction(action1);
    menu1_1->addAction(action2);
}

MainWindow::~MainWindow()
{
    delete ui;
}

添加分割线

如果菜单项特别多,可以通过`add分割线进行分组,让用户看的更清楚

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);
    QMenu* menu1 = new QMenu("菜单1");
    QMenu* menu2 = new QMenu("菜单2");
    QMenu* menu3 = new QMenu("菜单3");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

    QAction* action1 = new QAction("菜单项1");
    QAction* action2 = new QAction("菜单项2");
    QAction* action3 = new QAction("菜单项3");
    QAction* action4 = new QAction("菜单项4");

    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addSeparator();  //添加分割线
    menu1->addAction(action3);
    menu1->addSeparator();
    menu1->addAction(action4);

}

MainWindow::~MainWindow()
{
    delete ui;
}

添加图标

cpp 复制代码
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //QMenuBar* menuBar = new QMenuBar();
    QMenuBar* menuBar = this->menuBar();
    this->setMenuBar(menuBar);
    QMenu* menu1 = new QMenu("菜单1");
    QMenu* menu2 = new QMenu("菜单2");
    QMenu* menu3 = new QMenu("菜单3");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);
    menuBar->addMenu(menu3);

    QAction* action1 = new QAction("kun");
    action1->setIcon(QIcon(":/ikun.png"));
    QAction* action2 = new QAction("篮球");
    action2->setIcon(QIcon(":/ikun2.png"));

    menu1->addAction(action1);
    menu1->addAction(action2);

}

MainWindow::~MainWindow()
{
    delete ui;
}

通过qrc机制导入图像,然后再进行设置

QMenu设置图标:

  • 如果是长在QMenuBar上文字就没有了,直接显示图标
  • 如果是子菜单,都显示
相关推荐
我好喜欢你~23 分钟前
C#---StopWatch类
开发语言·c#
lifallen2 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研2 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
cui__OaO3 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
鱼鱼说测试4 小时前
Jenkins+Python自动化持续集成详细教程
开发语言·servlet·php
艾莉丝努力练剑4 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
CHEN5_024 小时前
【Java基础面试题】Java基础概念
java·开发语言
杜子不疼.6 小时前
《Python学习之字典(一):基础操作与核心用法》
开发语言·python·学习
落霞的思绪6 小时前
Java设计模式详细解读
java·开发语言·设计模式
阿巴~阿巴~6 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list