Qt窗口(1)-菜单栏

发布于:2025-07-19 ⋅ 阅读:(12) ⋅ 点赞:(0)

Qt窗口

概念简述

与QWidget的区别:

QWidget更多是作为一个窗口的一部分

基本结构构成:
在这里插入图片描述
以Xshell举例子比较菜单栏和工具栏:

菜单栏:
在这里插入图片描述

工具栏:
在这里插入图片描述
工具栏本质是把菜单栏中一些比较常用的选项,直接放到工具栏中,直接点击工具栏中的按钮就可以快速生效

菜单栏的使用

在这里插入图片描述
这里需要选择QMainWindow

通过ui文件创建菜单

创建好文件之后,打开ui文件会与之前的发生不同
在这里插入图片描述
如这里的“在这里输入”,这样就可以创建菜单了

创建好菜单栏想要创建菜单项会出现bug,无法直接输入中文,可以通过复制粘贴的方式进行,如在记事本中输入文本,再次粘贴到对话框中

运行结果如下:
在这里插入图片描述

使用代码的方式创建菜单结构

代码如下:

//1.创建一个菜单栏
    QMenuBar*menuBar=new QMenuBar();
    this->setMenuBar(menuBar);

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

    //3.给菜单添加菜单项
    QAction*action1=new QAction("新建");
    QAction*action2=new QAction("打开");
    QAction*action3=new QAction("保存");
    QAction*action4=new QAction("另存为");
    QAction*action5=new QAction("退出");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu1->addAction(action3);
    menu1->addAction(action4);
    menu1->addAction(action5);

运行结果如下:
在这里插入图片描述
如何让点击菜单项有反应?

可以给用户添加信号槽:

//4.给action添加信号槽
    connect(action1,&QAction::triggered,this,&MainWindow::handle);
    connect(action5,&QAction::triggered,this,&MainWindow::close);

运行结果如下:
在这里插入图片描述

菜单添加快捷键

设置好快捷键可以结合alt使用

代码如下:
在这里插入图片描述
&并不会在窗口上显示

代码如下:

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

    QMenu*menu1=new QMenu("文件(&F)");
    QMenu*menu2=new QMenu("视图(&V)");
    menuBar->addMenu(menu1);
    menuBar->addMenu(menu2);

    QAction*action1=new QAction("action1(&Q)");
    QAction*action2=new QAction("action2(&W)");
    QAction*action3=new QAction("action3(&E)");
    QAction*action4=new QAction("action4(&R)");
    menu1->addAction(action1);
    menu1->addAction(action2);
    menu2->addAction(action3);
    menu2->addAction(action4);
    connect(action1,&QAction::triggered,this,&MainWindow::handle1);
    connect(action2,&QAction::triggered,this,&MainWindow::handle2);
    connect(action3,&QAction::triggered,this,&MainWindow::handle3);
    connect(action4,&QAction::triggered,this,&MainWindow::handle4);

添加子菜单

运行结果:
在这里插入图片描述

添加分割线

运行结果:
在这里插入图片描述

添加图标

代码如下:

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

    QMenu*menu=new QMenu("菜单");
    menuBar->addMenu(menu);
    

    QAction*action1=new QAction("菜单项1");
    action1->setIcon(QIcon(":/open.png"));
    QAction*action2=new QAction("菜单项2");
    action2->setIcon(QIcon(":/save.png"));
    menu->addAction(action1);
    menu->addAction(action2);

运行结果如下:
在这里插入图片描述
如果给菜单设置图标呢?

此时只会显示图标,文字会被覆盖

在这里插入图片描述

关于创建MenuBar的讨论

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

如果没有点击自动勾选ui,此代码是OK,如果勾选则会造成内存泄漏
在这里插入图片描述
之前的程序已经自己创建了一个对象,当自己通过代码设置的时候,旧的会从对象树上脱离,导致资源泄漏

如果关闭的话,对象树会结束,此进程也会结束,不会造成影响,但是如果频繁切换窗口,会有问题

更规范的写法:

QMenuBar*menuBar=this->menuBar();

如果存在直接返回,不存在会创建新的再返回

如果在以后工作中遇到嵌入式,内存很有限可能就不能够泄漏内存


网站公告

今日签到

点亮在社区的每一天
去签到