【Qt】窗口预览(1)—— 菜单栏

窗口预览(1)

  • 1. QMainWindow
  • 2. QMenuBar——菜单栏
    • 2.1 创建菜单栏/将菜单栏添加到widget中
    • 2.2 addMenu——在菜单栏中添加菜单
    • 2.3 在菜单中添加选项
    • 2.4 添加快捷键
    • 2.5 支持嵌套添加菜单
    • 2.6 添加信号
    • 2.7 添加分割线

1. QMainWindow

Qt窗口是通过QMainWindow类来实现的。
QMainWindow是⼀个为用户提供主窗口程序的类,继承自QWidget类,并且提供了⼀个预定义的布局。QMainWindow包含⼀个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗(铆接部件)(dock widgets)、⼀个状态栏(status bar)和⼀个中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中各组件所处的位置:

在这里插入图片描述

我们之前创建文件的时候都是勾选的QWidget,但是这里我们要勾选QMainWindow

在这里插入图片描述
此时我们打开创建好的文件的ui文件,我们会发现一些与以往不同的地方:

  • 在窗口的最上方出现了一个编辑框,这个编辑框就是设置菜单的地方,同时在左侧的窗口属性中再也不是空的了,而是自动创建好了一个menubar,statusbar和centeralwidget。

在这里插入图片描述

2. QMenuBar——菜单栏

我们在使用很多的工具的时候在最上方都会有一个菜单栏,大部分的操作都是可以通过菜单栏进行实现功能的,我们的Qt creator也是如此。

在这里插入图片描述

2.1 创建菜单栏/将菜单栏添加到widget中

方法一:我们可以直接通过ui界面的最上方直接进行设置,因为我们创建文件的时候,QMainWindow以及给我们创建好了menuBar.

方法二:使用代码手动创建一个菜单栏,并将这个菜单栏设置到widget中,将菜单栏设置到widget函数setMenuBar(QMenuBar*)

注意:一般我们创建都是在堆上创建菜单栏,但是这里会出现一个问题,就是如果我们勾选了自动生成ui文件的话(一般我们都会进行勾选)当我们创建好了文件后,Qt会自动帮我们创建好一些代码,其中就包括了上面我们讲过了menubar,statusbar和centeralwidget这三个(这里我们就拿menubar来举例子,其他的也是一样的)如果我们直接使用QMenuBar * menu = new QMenuBar()的方式来创建菜单栏的话,就会导致内存泄漏,因为我们在创建好文件的时候Qt已经创建好了一菜单栏,而这里我们又手动的创建了一个菜单栏,就会把Qt帮我们创建的菜单栏给挤出对象树,所以当我们关闭窗口的时候对象树却是会帮我们delete掉我们手动创建的菜单栏,但是Qt帮我们创建的菜单栏就得不到delete就会造成内存泄漏,所以我们一般推提倡这样创建菜单栏:

QMenuBar* menu = this->menuBar();

2.2 addMenu——在菜单栏中添加菜单

通过QMenu创建菜单,使用addMenu将菜单添加到菜单栏中


MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menu = this->menuBar();// 添加菜单栏this->setMenuBar(menu);// 创建菜单QMenu* menu1 = new QMenu("文件");QMenu* menu2 = new QMenu("工具");QMenu* menu3 = new QMenu("帮助");// 将菜单添加到菜单栏中menu->addMenu(menu1);menu->addMenu(menu2);menu->addMenu(menu3);
}

在这里插入图片描述

2.3 在菜单中添加选项

在Qt中可以通过QAction类创建出一个菜单选项,然后使用addAction函数添加到菜单中。

// 创建选项
QAction* opt1= new QAction("创建");
QAction* opt2= new QAction("打开");
QAction* opt3= new QAction("关闭");
// 将选项添加到菜单中
menu1->addAction(opt1);
menu1->addAction(opt2);
menu1->addAction(opt3);

在这里插入图片描述

2.4 添加快捷键

方法一:可以使用直接使用setShortcut函数来直接设置快捷键

方法二:可以使用(&+快捷键)(这样设置后直接使用alt + 快捷键即可使用快捷键)的方式直接进行设置快捷键

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menu = this->menuBar();// 添加菜单栏this->setMenuBar(menu);// 创建菜单QMenu* menu1 = new QMenu("文件(&F)"); // 设置快捷键QMenu* menu2 = new QMenu("工具(&T)");QMenu* menu3 = new QMenu("帮助(&H)");// 将菜单添加到菜单栏中menu->addMenu(menu1);menu->addMenu(menu2);menu->addMenu(menu3);// 创建选项QAction* opt1= new QAction("创建");QAction* opt2= new QAction("打开");QAction* opt3= new QAction("关闭");// 将选项添加到菜单中menu1->addAction(opt1);menu1->addAction(opt2);menu1->addAction(opt3);// 设置快捷键opt1->setShortcut(QKeySequence("C"));opt2->setShortcut(QKeySequence("O"));opt3->setShortcut(QKeySequence("E"));
}

在这里插入图片描述

2.5 支持嵌套添加菜单

除了可以给菜单添加选项之外还可以给菜单添加菜单,也就是嵌套菜单。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 创建菜单栏QMenuBar* menu = this->menuBar();// 添加菜单栏this->setMenuBar(menu);// 创建菜单QMenu* menuparent= new QMenu("选项一");menu->addMenu(menuparent);// 创建选项QMenu* menuchild = new QMenu("子菜单");QAction* opt1 = new QAction("打开");QAction* opt2 = new QAction("关闭");menuparent->addAction(opt1);menuparent->addAction(opt2);// 给子菜单添加选项QAction* opt3 = new QAction("菜单一");QAction* opt4 = new QAction("菜单二");menuchild->addAction(opt3);menuchild->addAction(opt4);menuparent->addMenu(menuchild);
}

在这里插入图片描述

2.6 添加信号

这里一般都是给选项添加信号

connect(opt2, &QAction::triggered, this, &QMainWindow::close);
  • 使用QFileDialog 来实现选择文件的效果.
    • getSaveFileName 用于保存文件的场景. 此时的对话框可以输入文件名.
    • getOpenFileName 用于打开文件的场景. 此时的对话框可以获取到鼠标选择的文件名.
  • 搭配 C++标准库的文件操作实现文件读写.
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QMenuBar* menubar = this->menuBar();this->setMenuBar(menubar);QMenu* menu = new QMenu("文件");menubar->addMenu(menu);// 创建菜单选项QAction* action1 = new QAction("保存");QAction* action2 = new QAction("加载");menu->addAction(action1);menu->addAction(action2);// 创建中央控件edit = new QTextEdit();this->setCentralWidget(edit);// 设置中央控件edit->setPlaceholderText("请在此处编辑内容……");// 设置槽函数connect(action1, &QAction::triggered, this, &MainWindow::save);connect(action2, &QAction::triggered, this, &MainWindow::load);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::save()
{// 弹出对话框,选择写入的文件的路径QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getSaveFileName(this, "保存文件", "D:/App_2/Qt");qDebug() << "fileName:" << fileName;// 写入文件std::ofstream file(fileName.toStdString().c_str());if (!file.is_open()){qDebug() << "文件保存失败";return;}const QString& text = edit->toPlainText();file << text.toStdString();file.close();
}void MainWindow::load()
{// 弹出对话框,选择打开的文件QFileDialog* dialog = new QFileDialog(this);QString fileName = dialog->getOpenFileName(this, "加载文件", "D:/App_2/Qt");qDebug() << "fileName" << fileName;// 加载文件std::ifstream file(fileName.toStdString().c_str());if(!file.is_open()){qDebug() << "文件打开失败";return;}std::string content;std::string line;while(std::getline(file, line)){content += line;content += "\n";}file.close();// 显示到界面上QString text = QString::fromStdString(content);edit->setPlainText(text);
}

保存文件
在这里插入图片描述
加载文件
在这里插入图片描述

2.7 添加分割线

使用addSeparator函数在两个选项中间即可

menu->addAction(action1);
menu->addSeparator();
menu->addAction(action2);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM框架学籍管理系统的设计与实现

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;乡下小哥编程。回复 Java全套视频教程 或 前端全套视频教…

微信小程序和抖音小程序的分享和广告接入代码

开发完成小程序或者小游戏之后&#xff0c;我们为什么要接入分享和广告视频功能&#xff0c;主要原因有以下几个方面。 微信小程序和抖音小程序接入分享和广告功能主要基于以下几个原因&#xff1a; 用户获取与增长&#xff1a;分享功能可以帮助用户将小程序内容传播给更多人&…

# 在执行 rpm 卸载软件使用 nodeps 参数时,报错 error: package nodeps is not installed 分析

在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 分析 一、问题描述&#xff1a; 在执行 rpm 卸载软件使用 nodeps 参数时&#xff0c;报错 error: package nodeps is not installed 如下图&#xff1a; 二、报错分析&…

【HarmonyOS NEXT】实现页面水印功能

关键词&#xff1a;鸿蒙、水印、Watermark、页面、触摸问题 注&#xff1a;本期文章同样适用 OpenHarmony 的开发 在app开发过程中时常会出现敏感信息页面&#xff0c;为保护信息安全和及时的数据追踪&#xff0c;通常会采用给页面加水印的形式&#xff0c;那么本期文章会介绍…

ARC学习(4)基本编程模型认识(四)----寄存器以及异常数据读取

笔者来聊一下ARC寄存器的获取 在介绍了ARC编程模型的知识点之后,来看一些具体的编程操作,比如如何获取寄存器,如何编写汇编语言实现特定功能? 1、获取寄存器 可以使用内联汇编来实现寄存器的获取,具体格式如下: _Asm:汇编宏标识符,指示内联汇编代码_Save_all_regs:…

轻量服务器和云服务器ecs哪个好用一些?

轻量服务器和云服务器ecs哪个好用一些&#xff1f;轻量服务器与云服务器ECS在多方面存在显著差异&#xff0c;对于需要高性能计算和大规模数据处理的用户来说&#xff0c;ECS可能是更好的选择&#xff1b;而对于预算有限且需求较为简单的用户来说&#xff0c;轻量服务器可能更为…

Node.js入门——fs、path模块、URL端口号、模块化导入导出、包、npm软件包管理器

Node.js入门 1.介绍 定义&#xff1a;跨平台的JS运行环境&#xff0c;使开发者可以搭建服务器端的JS应用程序作用&#xff1a;使用Node.Js编写服务器端代码Node.js是基于Chrome V8引擎进行封装&#xff0c;Node中没有BOM和DOM 2.fs模块-读写文件 定义&#xff1a;封装了与…

分布式事务管理-Seata从入门到精通

一、基本概念 什么是数据库事务&#xff1f; 1、一个操作数据库数据的执行单元 2、到围从开始到结束的多个操作组成 3、事务内的多个操作要么都成功,要么都失败 什么是分布式事务&#xff1f; 1.分布式场景下&#xff0c;完成某一个业务功能可能需要横跨多个服务&#xff0…

jmeter入门:脚本录制

1.设置代理。 网络连接-》代理-》手动设置代理. ip&#xff1a; 127.0.0.1&#xff0c; port&#xff1a;8888 2. add thread group 3. add HTTP(s) test script recorder, target controller chooses Test plan-> thread Group 4. click start. then open the browser …

AIGC毕设项目分享:基于RAG的数字人对话系统及其应用

本研究的主要目标是设计并实现一个基于检索增强生成&#xff08;RAG&#xff09;技术的数字人对话系统&#xff0c;旨在提升数字人系统在多轮对话中的上下文管理、情境感知能力以及动态内容生成效果。系统结合了深度学习中的最新大语言模型技术&#xff0c;通过引入RAG框架来增…

ubuntu下route命令详解

buntu下route命令详解 1、显示路由表 route -n2、临时路由设置&#xff0c;重启网卡失效#添加一条路由(发往192.168.62这个网段的全部要经过网关192.168.1.1)route add -net 192.168.62.0 netmask 255.255.255.0 gw 192.168.1.1#删除一条路由 删除的时候不用写网关route del …

华为海思:大小海思的双轮驱动战略分析

华为海思,作为华为旗下的半导体设计部门,近年来在芯片设计领域取得了显著成就,成为了中国乃至全球芯片设计的重要力量。实际上,华为海思并非单一实体,而是由两个主要分支构成:大海思和小海思。这两个分支虽然同属华为海思,但在定位、产品布局以及市场策略上有所不同,共…

【测试】BUG篇——BUG

bug的概念 定义&#xff1a;⼀个计算机bug指在计算机程序中存在的⼀个错误(error)、缺陷(flaw)、疏忽(mistake)或者故障(fault)&#xff0c;这些bug使程序⽆法正确的运⾏。Bug产⽣于程序的源代码或者程序设计阶段的疏忽或者错误。 准确的来说&#xff1a; 当且仅当规格说明&am…

【大数据技术基础 | 实验二】Linux基础:常用基本命令和文件操作

文章目录 一、实验目的二、实验要求三、实验环境四、常用基本命令1、验证cd和pwd命令2、验证ls命令3、验证mkdir命令4、验证cp、mv和rm命令 五、Linux文件操作1、验证touch命令2、验证cat命令3、验证more命令 六、实验心得 一、实验目的 学会linux常用命令(cd,ls,pwd,mkdir,rm…

【Flutter】合并多个流Stream

1.说明 无意间发现了一个好用的库rxdart&#xff0c;它为 Dart 的 Stream 添加了额外的功能。 2.功能 &#xff08;1&#xff09;合并多个流Stream 借助Rx.combineLatest2()合并两个流stream1和stream2。 注意&#xff1a;如果dart文件中同时使用了getx&#xff0c;需要隐…

腾讯云视立方Electron 相关问题

安装相关 trtc-electron-sdk 是否兼容官方 Electron v12.0.1 版本? 兼容的&#xff0c;trtc-electron-sdk 没有特别依赖 elecron 自身的 SDK&#xff0c;所以没有相关的版本依赖。 Electron 下载慢甚至卡住不动&#xff1f; 当开始下载tmp-3320-1-SHASUMS256.txt-6.1.9文件…

【c语言——指针详解(4)】

文章目录 一、回调函数是什么&#xff1f;二、qsort的使⽤1、使⽤qsort函数排序整型数据2、使⽤qsort排序结构数据 三、qsort函数的模拟实现 作者主页 一、回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xf…

【进阶OpenCV】 (12)--人脸检测识别

文章目录 人脸识别一、获取分类器二、代码实现1. 图片预处理2. 加载人脸检测分类器3. 检测人脸4. 标注人脸 总结 人脸识别 要实现人脸识别首先要判断当前图像中是否出现了人脸&#xff0c;这就是人脸检测。只有检测到图像中出现了人脸&#xff0c;才能据此判断这个人到底是谁。…

模拟电子电路基础(常见半导体+multisim学习1)

目录 1.半导体的基础 1.1.半导体基础知识 1.1.1本征半导体 1.1.2杂质半导体 1.1.3PN结 1.2半导体二极管 1.2.1半导体二极管的几种常见结构 1.2.2二极管的伏安特性曲线 1.2.3二极管的主要参数 1.2.4二级管的等效电路 1.2.5稳压二极管 1.2.其他类型二极管 2.multisim的…

计算机网络:数据链路层 —— PPP 点对点协议

文章目录 PPP 帧PPP帧的格式PPP帧的透明传输面向字节的异步链路面向比特的同步链路 PPP帧的差错检测 PPP 的工作状态 点对点协议&#xff08;Point-to-Point Protocol&#xff0c;PPP&#xff09;是目前使用最广泛的点对点数据链路层协议&#xff0c;用于在两个节点之间进行数据…