当前位置: 首页 > news >正文

Qt窗口:菜单栏

目录

一、窗口预览

二、菜单栏

快捷键

子菜单

分割线

图标

内存泄露


一、窗口预览

在前面几篇文章中,或者说,Qt初学阶段,接触到的都是QWidget,QWidget指控件,往往作为一个窗口的一部分出现。所谓的窗口,形象的说,就是在Qt Creator中创建项目时,可选项目类型中的MainWindow

Qt的窗口,是通过QMainWindow类实现,继承自QWidget。

下图为QMainWindow中各个部分所在位置。

Menu Bar,粗略的理解。

Tool Bar Area,往往是菜单栏中常用的工具,比如XShell

Dock Widget Area

二、菜单栏

一个窗口只能有一个菜单栏(QMenuBar),一个菜单栏可以有多个菜单(QMenu),一个菜单往往会有多个菜单项(QAction),之所以命名为QAction,是因为工具栏中的多数操作也是菜单栏的快捷方式,统一称QAction。

  • 代码实践

图形化创建菜单很简单,这里不再演示。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menuBar = new QMenuBar(this);//设置窗口有一个菜单栏this->setMenuBar(menuBar);//菜单QMenu* menu1= new QMenu("文件");QMenu* menu2= new QMenu("编辑");QMenu* menu3= new QMenu("视图");QMenu* menu4= new QMenu("关于");//菜单栏中加菜单menuBar->addMenu(menu1);menuBar->addMenu(menu2);menuBar->addMenu(menu3);menuBar->addMenu(menu4);//设置菜单项QAction* action1 = new QAction("新建");QAction* action2 = new QAction("打开");QAction* action3 = new QAction("关闭");menu1->addAction(action1);menu1->addAction(action2);menu1->addAction(action3);//菜单项的点击是一个信号,名为触发信号connect(action1,&QAction::triggered,this,&MainWindow::handle_create);connect(action2,&QAction::triggered,this,&MainWindow::handle_open);connect(action3,&QAction::triggered,this,&MainWindow::close);}

void MainWindow::handle_create()
{qDebug() << "新建";
}void MainWindow::handle_open()
{qDebug() << "打开";
}

快捷键

有一种很简单的方式,像下面这样写,比如&F 就等于 添加了Alt + F这样的快捷键。

    QMenu* menu1= new QMenu("文件 (&F)");QMenu* menu2= new QMenu("编辑 (&E)");QMenu* menu3= new QMenu("视图 (&V)");QMenu* menu4= new QMenu("关于 (&A)");

  • QAction绑定快捷键

QAction绑定方式也可以效仿上面那样。

    QAction* action1 = new QAction("新建(&C)");QAction* action2 = new QAction("打开(&O)");QAction* action3 = new QAction("关闭(&Q)");

运行程序,按下 Alt + F 、C

子菜单

    //添加子菜单QMenu* menuChild = new QMenu("子菜单");menu1->addMenu(menuChild);//给子菜单添加菜单项QAction* actionChild = new QAction("菜单项");menuChild->addAction(actionChild);

分割线

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

图标

    QAction* action1 = new QAction("新建(&C)");action1->setIcon(QIcon(":/create.jpg"));

也可以给菜单设置图标,只不过QMenu的图标会覆盖文本,而子菜单的图片和文本可以共存。

内存泄露

在上述代码实践中,造成了内存泄露。原因是QMainWindow下,Qt的ui文件会自动生成一个QMenuBar。

而代码中我们是new了一个新的MenuBar,又因为一个窗口只能有一个MenuBar,导致自动生成的MenuBar被new出来的替换,脱离了对象树,造成内存泄露。

解决的办法很简单,保留一个即可,我们在代码中不再new一个新的,而是使用本来就有的。

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

这种写法,如果menuBar存在,则直接获取。如果不存在,则新创建一个。

http://www.lryc.cn/news/585808.html

相关文章:

  • 企业选择大带宽服务器租用的原因有哪些?
  • Spring Ai Alibaba Gateway 实现存量应用转 MCP 工具
  • 如何查看服务器当前用户的权限
  • [es自动化更新] Updatecli编排配置.yaml | dockerfilePath值文件.yml
  • QT中设计qss字体样式但是没有用【已解决】
  • 进制转换小题
  • Django母婴商城项目实践(三)
  • 【Luogu】每日一题——Day1. P3385 【模板】负环
  • Redis概念和基础
  • [论文阅读] 人工智能 + 软件工程 | LLM辅助软件开发:需求如何转化为代码?
  • 端口到底是个什么鬼?回答我!
  • Java大厂面试故事:谢飞机的互联网医疗系统技术面试(Spring Boot、MyBatis、Kafka、Spring Security、AI等)
  • Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)
  • TensorFlow2 study notes[1]
  • 【每日算法】专题八_分治_归并排序
  • The Practice of Programming
  • 【2025/07/11】GitHub 今日热门项目
  • 2025十大免费销售管理软件推荐
  • AIGC(生成式AI)试用 33 -- 用AI学AI名词
  • [spring6: @EnableLoadTimeWeaving]-使用案例
  • 人脸图像生成(DCGAN)
  • Linux入门篇学习——Linux 编写第一个自己的命令,make 工具和 makefile 文件
  • C++编程基础
  • 大模型在卵巢癌预测及诊疗方案制定中的应用研究
  • Linux驱动基本概念(内核态、用户态、模块、加载、卸载、设备注册、字符设备)
  • Allegro 17.4操作记录
  • 【理念●体系】从零打造 Windows + WSL + Docker + Anaconda + PyCharm 的 AI 全链路开发体系
  • 数据库系统的基础知识(三)
  • uniapp---入门、基本配置了解
  • spring-ai RAG(Retrieval-Augmented Generation)