Qt菜单栏

文章目录

  • 创建菜单栏
  • 创建菜单并在菜单栏中添加
  • 创建子菜单并添加到菜单
  • 创建菜单项并在菜单中添加
  • 分割线
  • 实现简易的记事本

Qt 窗口是通过 QMainWindow类 来实现的

img

创建菜单栏

Qt 中的菜单栏是通过 QMenuBar 这个类来实现的,一个窗口最多只有一个菜单栏。

菜单栏包含了菜单,而菜单又包含了菜单项

img

上图可以看出,菜单里面不只是可以包含菜单项,也可以包含菜单,这种被菜单包含的菜单成为子菜单

可以有两种方式创建菜单栏:

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

对于菜单栏而言,在QMainWindow类对象被创建出来时默认是自动生成了一个菜单栏的。

因此对于第一种方式而言:通过重新new出来一个 QMenuBar 对象再赋值给 this,这种方式就会导致 this 默认自动生成的菜单栏被挤出对象树,这种情况就会导致找不到默认的菜单栏从而无法释放。虽然对于客户端而言这一点点的泄漏问题可以不会很大,但是还是做到尽量完美。

对于第二种方式而言:this->menuBar() 会有两种情况:当 this 没有菜单栏时会自动生成一个菜单栏;当 this 有菜单栏时就获取已有的菜单栏。所以第二种方式就不会多生成出额外的菜单栏对象,也就不会出现内存泄漏的情况。

创建菜单并在菜单栏中添加

菜单的类型为 QMenu,菜单栏通过 addMenu 函数去添加菜单

// 创建菜单
// (&?):设置快捷键(?可以是任一字母)
// 菜单的快捷键需要搭配 alt 键使用
QMenu *m1 = new QMenu("文件(&F)");
QMenu *m2 = new QMenu("编辑(&E)");
QMenu *m3 = new QMenu("构建(&B)");// 将菜单加到菜单栏
menuBar->addMenu(m1);
menuBar->addMenu(m2);
menuBar->addMenu(m3);

img

创建子菜单并添加到菜单

添加子菜单的方式:先创建出需要的子菜单(子菜单也是菜单,也是 QMenu 类型),然后菜单可以通过 addMenu 函数添加子菜单。

// 创建子菜单
QMenu *c1 = new QMenu("最近打开文件");
// 将子菜单加到菜单
m1->addMenu(c1);

img

创建菜单项并在菜单中添加

在 Qt 中并没有专门的菜单项类,可以通过 QAction 类抽象出公共的动作。

菜单项也可以为自己添加图标,setIcon(QIcon *)

// 创建菜单项
QAction *a1 = new QAction("打开(&O)");
QAction *a2 = new QAction("另存为(&A)");
a2->setIcon(QIcon(":/img/save.png")); // 给菜单项设置图标
QAction *a3 = new QAction("清除菜单");// 将菜单项加到菜单
m1->addAction(a1);
m1->addAction(a2);
c1->addAction(a3);

img

分割线

菜单项之间可以添加分割线,子菜单之间也可以添加分割线。

通过菜单调用 addSeparator 函数

// 将菜单项加到菜单
m1->addAction(a1);
m1->addSeparator(); // 添加分割线
m1->addAction(a2);
c1->addAction(a3);
// 将子菜单加到菜单
m1->addMenu(c1);
m1->addSeparator(); // 添加分割线
m1->addMenu(c2);

img

实现简易的记事本

用到了 QFileDialog 类来实现显示文件和文件夹选择对话框的功能,其中:

  1. getSaveFileName 用于保存文件的场景,此时的对话框可以输入文件名
  2. getOpenFileName 用于打开文件的场景,此时的对话框可以获取到鼠标选择的文件名
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTextEdit>
#include <QFileDialog>
#include <fstream>
#include <ostream>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 设置标题this->setWindowTitle("简易记事本");// 创建菜单栏QMenuBar *menuBar = this->menuBar();this->setMenuBar(menuBar);// 创建菜单// (&?):设置快捷键(?可以是任一字母)// 菜单的快捷键需要搭配 alt 键使用QMenu *m1 = new QMenu("文件(&F)");// 创建菜单项QAction *a1 = new QAction("保存(&S)");QAction *a2 = new QAction("打开(&O)");a1->setIcon(QIcon(":/img/save.png")); // 给菜单项设置图标// 将菜单项加到菜单m1->addAction(a1);m1->addSeparator(); // 添加分割线m1->addAction(a2);// 将菜单加到菜单栏menuBar->addMenu(m1);// 使用多行输入框作为中心控件QTextEdit *edit = new QTextEdit(this);this->setCentralWidget(edit);// 使用 QFileDialog 显示文件和文件夹选择对话框QFileDialog *dialog = new QFileDialog(this);// 设计选中保存菜单项的槽函数connect(a1, &QAction::triggered, this, [=](){// 弹出对话框,选择保存的路径,获取文件路径QString fileName = dialog->getSaveFileName(this, "保存文件", "D:/");fileName += ".txt";// 打开文件std::ofstream file(fileName.toStdString().c_str());if(!file.is_open()){qDebug() << "文件保存失败";return;}// 写入数据到文件中const QString &text = edit->toPlainText();file << text.toStdString();file.close(); // 关闭文件});// 设计选中打开菜单项的槽函数connect(a2, &QAction::triggered, this, [=](){// 弹出对话框,选中打开的文件,获取文件路径QString fileName = dialog->getOpenFileName(this, "打开文件", "D:/");// 打开文件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(content.c_str());edit->setPlainText(text);});
}

保存文件:

img

img

打开文件:

img

img

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

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

相关文章

MyBatis 源码分析 - 缓存原理

MyBatis 源码分析 - 缓存原理 1.简介 在 Web 应用中&#xff0c;缓存是必不可少的组件。通常我们都会用 Redis 或 memcached 等缓存中间件&#xff0c;拦截大量奔向数据库的请求&#xff0c;减轻数据库压力。作为一个重要的组件&#xff0c;MyBatis 自然也在内部提供了相应的…

EDGE的使用心得和深度探索

Microsoft Edge 是微软推出的一款基于 Chromium 开源项目的网页浏览器&#xff0c;自 2020 年重大更新后&#xff0c;在性能、兼容性和扩展支持方面得到了显著提升。以下是关于 Edge 浏览器的使用心得和一些深度探索的内容。 使用心得 1. 性能与兼容性&#xff1a;Edge 浏览器…

浅理解vue2中的模板编译

vue组件实例在初始化完成各种状态数据后&#xff0c;会触发vm.$mount()方法来进行模板编译阶段&#xff0c;有两种触发方式 // 方法一&#xff1a;主动触发 new Vue({ el: #app }) if (vm.$options.el) {vm.$mount(vm.$options.el); }// 方法二&#xff1a;手动调用 new Vue()…

遗传算法 定义+特性+原理+公式+Python示例代码(带详细注释)

文章目录 引言定义特性基本原理和公式推导基本原理公式推导 实现步骤和代码实现实现步骤Python代码实现&#xff08;带详细注释&#xff09; 应用案例优化和挑战结论 引言 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是进化计算技术的一种&#xff0c;广泛应用于解…

Yarn的安装和配置

第一部分&#xff1a;安装与配置Yarn 在开始之前&#xff0c;我们需要先安装Yarn。下面是一些简单的步骤&#xff1a; 步骤1&#xff1a;下载并安装Node.js Yarn是基于Node.js的&#xff0c;因此我们首先需要安装Node.js。请前往Node.js官网&#xff08;https://nodejs.org/&a…

绘制音频时长核密度分布图

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt# 读取文件到DataFrame # 可以读百万行文件 df pd.read_csv(wav_dur_million.info, sep , header0, names[音频名, 音频时长])# 绘制核密度图 sns.kdeplot(df[音频时长], fillTrue) plt.xlabel(dur…

Elasticsearch:(二)1.安装Elasticsearch

1.环境安装介绍: 安装java环境安装Elasticsearch安装kibana安装Elasticsearch-head插件 本节文章主要讲解Elasticsearch的安装。 2.版本选择 jdk兼容性:支持一览表 | Elastic 操作系统兼容性:支持一览表 | Elastic 自身产品兼容性: 支持一览表 | Elastic jdk版本选择:…

道可云元宇宙每日资讯|北京:推进数字+场景落地

道可云元宇宙每日简报&#xff08;2024年4月15日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 上海市闵行区医学会元宇宙医学专业委员会举行成立大会 4月10日&#xff0c;上海市闵行区医学会元宇宙医学专业委员会举行成立大会。会上&#xff0c;全球领先的元宇…

安装Miniconda@FreeBSD13

近几年在学习和使用AI框架的时候&#xff0c;时时刻刻在想着如何在FreeBSD下进行训练和推理部署&#xff0c;可惜一直没有如愿。 近几天在调试大模型的一些项目时&#xff0c;尝试将飞桨、torch和tensorflow装了个遍&#xff0c;可惜都没有成功。机缘巧合下&#xff0c;看到fre…

【智能算法】饥饿游戏搜索算法(HGS)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;Yang等人受到自然界饥饿驱动的活动和动物的行为选择启发&#xff0c;提出了饥饿游戏搜索算法&#xff08;Hunger Games Search, HGS&#xff09;。 2.算法原理 2.1算法思想 HGS…

酒店管理系统

文章目录 酒店管理系统一、项目演示二、项目介绍三、15000字论文参考四、部分功能截图五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 酒店管理系统 一、项目演示 酒店管理系统 二、项目介绍 基于springbootvue前后端分离的…

通过实例学C#之FileStream类

简介 可以通过此类进行文件读取。 首先在项目所在文件夹的Bin文件中新建一个test.txt文件&#xff0c;里面输入内容“hello world!”。 构造函数 FileStream (string path, FileMode mode&#xff0c;FileAccess access) 通过路径文件path&#xff0c;打开文件模式mode以及读写…

springboot注解学习记录(持续更新)

RestController 放在controller最前面&#xff0c;代表这个java文件是一个controller CrossOrigin 放在controller最前面&#xff0c;用于解决跨域情况下的请求。 RequestMapping(“/prefix”) 放在controller前&#xff0c;对当前controller所有的请求都要加上这个前缀 …

买婴儿洗衣机怎么选择?四大绝佳好用婴儿洗衣机分享

幼龄时期的宝宝的衣物&#xff0c;是比较需要注意的时候。可能一不注意宝宝穿在身上就会有不适宜症状发生。所以宝妈们真的要随时观察&#xff0c;然后在宝宝洗衣服的这上面多下点功夫&#xff0c;不要让宝宝受到这种无谓的伤害。小婴儿的抵抗力比我们差很多。有些细菌、病毒可…

今天给大家推荐36套404页面模板

404页面是网站必备的一个页面&#xff0c;它承载着用户体验与SEO优化的重任。当用户访问不存在的页面时&#xff0c;服务器会返回404错误代码&#xff0c;并显示404页面。一个好的404页面可以帮助用户快速找到所需信息&#xff0c;并提升网站的用户体验。 以下是一些演示下载资…

前端预处理器-stylus入门使用方法

Stylus是一款支持多样性的CSS预处理器&#xff0c;它的语法和普通的CSS有些不同&#xff0c;但更为简洁和灵活。以下是Stylus的入门使用方法&#xff1a; 安装Stylus&#xff1a;首先&#xff0c;你需要安装Node.js&#xff0c;这是运行Stylus的基础。然后&#xff0c;使用npm&…

速卖通爆款商品打造全攻略:从选品到补单,步步为赢

跨境电商行业的竞争也越来越大&#xff0c;速卖通卖家自然也要为店内的爆款而努力&#xff0c;同时也要清楚地意识到爆款也是有时限的&#xff0c;那么一款爆款商品该如何打造呢&#xff1f; 1.选品。 开店时&#xff0c;面对世界各地的消费者群体&#xff0c;远比国内复杂得…

JavaWeb--前端工程化

目录 1. 前端工程化 1.1. 概述 1.2. 前端工程化实现技术栈 2. ECMA6Script 2.1. es6的介绍 2.2. es6 变量 / 模版字符串 2.2.1. let 与 var 的差别 2.2.2. const 与 var 的差异 2.2.3. 模板字符串 2.3. 解构表达式 / 赋值 2.3.1. 数组解构赋值 2.3.2. 对象解构赋值 …

开发语言漫谈-kotlin

程序的运行环境包括移动设备、服务端、浏览器&#xff0c;服务器又分为window、linux等&#xff0c;不同的环境使用不同的开发语言。为了解决这个问题&#xff0c;开发IDE大拿JetBrains开发了kotlin。 Kotlin是一个岛屿的名字&#xff0c;全称是Kotlin Island。这个小岛位于俄罗…

xhs图片获取并且转换成PDF,实现了我考研期间一直想实现的想法

对于一些xhs图文&#xff0c;很多人其实想把它的图片保存到本地&#xff0c;尤其是下图所示的考研英语从文章中背单词&#xff0c;不说别人&#xff0c;我就是这样的。 我在考研期间就想实现把图片批量爬取下来&#xff0c;转成PDF&#xff0c;方便一篇一片阅读进行观看&#…