Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上

提要

当程序关闭后再次打开程序需要加载上一次的按钮名称设置。

思路

关闭程序的时候保存此刻界面按钮的文本,正常情况下只需在程序退出时调用的析构函数的内部实现,将界面所有的按钮文本生成一个文件,在程序下一次启动的时候,读取文件,设置按钮文本。这里需要考虑的是生成的文件的格式,读取文件时保存文件中的按钮文本的数据结构,当然由于按钮的顺序对应着相应的文本,这里采用每个按钮都有相应的id和index来标识,以找到对应的文本。

数据解构

其中index表示是第几个按钮,id表示对应文本的按钮id,name为按钮要显示的文本。

{"btnInfo": [{"id": 10008,"index": 1,"name": "场景8"}, {"id": 10026,"index": 2,"name": "场景K-P蝴蝶飞"}, {"id": 10014,"index": 3,"name": "场景即"}, {"id": 10021,"index": 6,"name": "场景及对QP"}, {"id": 10021,"index": 7,"name": "场景及对QP"}]
}

上面json文件的结构中,第一个按钮的文本为场景8,按钮的id为10008,依次类推。
也就是关闭程序的时候,需在析构函数中生成该格式的json文件。

SystemScenenForm::~SystemScenenForm()
{createJsonFile();//生成json文件delete ui;
}

生成json文件,其中变量m_btnInfoMap是用来保存界面按钮的文本的容器,QMap<int,stuSceNameId> m_btnInfoMap;//保存按钮的文本,id,按钮下标,以按钮下标为键

struct stuSceNameId
{QString name;int     id;
};
//以上结构体仅作为类型说明void SystemScenenForm::createJsonFile()
{QJsonObject data;QJsonObject subData1;QJsonArray array;int index;QMap<int,stuSceNameId>::iterator it;for(it = m_btnInfoMap.begin(); it != m_btnInfoMap.end(); ++it){index = it.key();stuSceNameId temp = *it;subData1.insert("index",index);subData1.insert("id",temp.id);subData1.insert("name",QString::fromLocal8Bit(temp.name.toLocal8Bit()));//将utf-8转换为gbkarray.append(subData1);}data.insert("btnInfo",array);QJsonDocument document;document.setObject(data);QByteArray jsonArray = document.toJson(QJsonDocument::Compact);QString strJson(jsonArray);QString strName = QCoreApplication::applicationDirPath() + "/sceneBtnInfo.json";QFile file(strName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){QString strTitle = "提示";QString strContent = QString("%1文件打开失败!").arg(strName);QMessageBox::information(this,strTitle,strContent);return ;}QTextStream in(&file);//生成的json文件中编码为gbkin<<strJson;file.close();
}

启动程序时读取json文件解析json,保存到内存中,设置按钮文本。

void SystemScenenForm::initSceneBtnInfo()
{QString strName = QCoreApplication::applicationDirPath() + "/sceneBtnInfo.json";QString byteArray = readSceneBtnInfo(strName);outPut<<"读到的字符串:"<<byteArray;if(byteArray.size() == 0){return ;}QByteArray array = byteArray.toUtf8();//将utf-8编码的QString类型变量转换为utf-8的QByteArray类型变量parseSceneBtnJson(array);//将m_scenBtnMap的id和name保存为从配置文件中读取的stuSceNameId temp;QMap<int,stuSceNameId>::iterator it;for(it = m_btnInfoMap.begin(); it != m_btnInfoMap.end(); ++it){temp = *it;m_scenBtnMap.insert(temp.id,temp.name);}
}//读json文件
QString SystemScenenForm::readSceneBtnInfo(QString fileName)
{QByteArray allData;
#ifdef OUT_PUToutPut<<"文件路径及名称:"<<fileName;
#endifQTextCodec *code = QTextCodec::codecForName("GBK");QFile file(fileName);if (!file.open(QIODevice::ReadOnly)){
#ifdef OUT_PUToutPut<<QString("%1配置文件读取失败!").arg(fileName);
#endifreturn allData;}allData = file.readAll();QString str = code->toUnicode(allData);//gbk编码的QByteArray类型变量转换为utf-8编码的QString变量file.close();
#ifdef OUT_PUT
//   outPut<<"json文件内容:"<<allData;
#endifreturn str;
}//解析json
void SystemScenenForm::parseSceneBtnJson(QByteArray &byteArray)
{int tempIndex;stuSceNameId tempStu;if(m_btnInfoMap.size() != 0){m_btnInfoMap.clear();}QJsonObject jsonObject;QJsonParseError jsonError;QJsonDocument document = QJsonDocument::fromJson(byteArray,&jsonError);if(!document.isEmpty() && jsonError.error == QJsonParseError::NoError){QJsonObject resultObject = document.object();QJsonValue jsonValue = resultObject.value("btnInfo");if(jsonValue.isArray()){QJsonArray jsonArray = jsonValue.toArray();for(int i = 0; i < jsonArray.size(); ++i){jsonObject = jsonArray.at(i).toObject();tempIndex = jsonObject.value("index").toInt();tempStu.id = jsonObject.value("id").toInt();tempStu.name = jsonObject.value("name").toString();m_btnInfoMap.insert(tempIndex,tempStu);}}}else{outPut<<"sceneBtnInfo.json文件解析失败"<<jsonError.errorString();}
}//创建按钮
void SystemScenenForm::createSceneBtn()
{int nRow = 0;//判断配置文件是否有按钮信息if(m_btnInfoMap.size() != 0){myButton *btn = NULL;for(int i = 0; i < SCENEBTN_NUM; ++i){btn = new myButton(i+1,ui->backgroundwidget);//查找下标对应的按钮名称QMap<int,stuSceNameId>::iterator it = m_btnInfoMap.find(i+1);if(it != m_btnInfoMap.end()){stuSceNameId temp = *it;btn->setText(temp.name);btn->setCreateSceneBtnName(temp.name);}if(i != 0 && i % 10 == 0){nRow++;}btn->setGeometry((21 + (i%10)*(69+122)) / m_percentW,(13 + nRow*59) / m_percentH,122 / m_percentW,46 / m_percentH);btn->show();m_idBtnMap.insert(i+1,btn);connect(btn,&myButton::clicked,this,&SystemScenenForm::slot_scenTransfer);connect(btn,&myButton::signalSaveBtnInfo,this,&SystemScenenForm::slot_saveBtnInfo);connect(this,&SystemScenenForm::signalUpdateBtnNameList,btn,&myButton::slot_updateBtnList);}}
}

其中myButton为自定义的按钮类,基类为QPushButton, btn = new myButton(i+1,ui->backgroundwidget);参数i+1为index,即按钮的个数,从1开始,ui->backgroundwidget为父控件,SCENEBTN_NUM为宏定义,一个指定的数字,m_percentW和m_percentH为自适应分辨率时的宽之比和高之比。
这篇文章是之前写的文件,内容可能比乱。

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

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

相关文章

MyBatis-Plus_快速入门0222

文章目录一、配置1.1、Spring Boot 工程&#xff1a;配置 MapperScan 注解1.2 Spring MVC 工程&#xff1a;配置 MapperScan1.2.1 调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory一、配置 MyBatis-Plus 的配置异常的简单&#xff0c;我们仅需要一些简单的配置即…

什么是云计算基础设施? | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;云计算基础设施是内部系统和公共云之间的软件和硬件层&#xff0c;其融合了许多不同的…

如何将本地代码推送至远程仓库_命令简化版本

如何将本地代码推送至远程仓库&#xff1f; 文章目录一、新仓库1. 初始化README.md2. 初始化Git仓库3. 将工作区的代码添加至暂存区4. 将暂存区的变更文件提交到本地仓库5. 将本地仓库和远程仓库建立连接6. 将本地代码push至远程仓库7. 先拉去代码&#xff0c;在push8. 强制推送…

K8S精华问答 | Kubernetes用的是Docker的容器?

kubernetes&#xff0c;简称K8s&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;目标是让部署容器化的应用简单并且高,并提供了应用部署&#xff0c;规划&#xff0c;更新&#xff0c;维护的一种机制。今天&#xff0c;我们就来看看…

qt中生成含有中文的json文件和解析json文件

提要 生成的json文件在程序加载解析时出现上述错误&#xff0c;究其原因是生成json文件过程中编码问题。qt编译器默认的编码格式为utf-8&#xff0c;而windows一般为gbk编码&#xff0c;所以就需要在生成本地json文件的时候将utf-8编码转换为gbk编码。读取json文件的时候&…

MyBatis-Plus_断言

MyBatis-Plus 之断言 文章目录1. 断言代码&#xff1a;2. 源码&#xff1a;3. 释义&#xff1a;4. 举个栗子&#xff1a;5. 异常信息&#xff1a;6. 控制台输出定位7. 查看数据库&#xff1a;1. 断言代码&#xff1a; Assert.assertEquals(5, userList.size());2. 源码&#x…

Twitter 宣布抛弃 Mesos,转向 Kubernetes;全球关键5G专利我国占34%;华为面试要改革?...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go2019伯克希尔股东大会&#x…

qt鼠标进入窗体后,窗体自动置顶

提要 鼠标进入窗体后&#xff0c;窗体自动置顶&#xff0c;鼠标移开窗体后&#xff0c;窗体恢复之前的状态。 示例 运行效果如下&#xff1a; 程序刚启动的效果如下&#xff1a; 鼠标放在某一个窗口上的效果如下&#xff1a; 可实现鼠标放在某一个窗口上该窗口置顶&#x…

MyBatis-Plus_入门试炼03

排除非表字段的3种方式 常见编程场景&#xff1a; 实体类中某个变量不对应数据库的表中的任何字段&#xff0c;用于暂时保存临时数据或者通过某种方式计算或组装的数据。 文章目录一、举个栗子&#xff1a;1.1 在User实体类中&#xff0c;添加remark属性1.2 执行插入操作&#…

SaaS路线图 | 时光机

戳蓝字“CSDN云计算”关注我们哦&#xff01;时光机&#xff1a;搭载这部时光机&#xff0c;带您回顾《程序员》大量优秀文章&#xff0c;重温经典技术干货&#xff0c;我们发现硬核技术永不过时&#xff0c;对于get要点、solve难题、提高自我&#xff0c;仍有非凡意义。作者&a…

qt将光标相对于桌面的位置转换为相对于窗口的位置

提要 鼠标光标获取的位置cursor().pos()是相对于整个屏幕坐标的&#xff0c;鼠标进入窗口的范围内&#xff0c;判断光标是否在窗口中某控件的范围内&#xff0c;就需先将相对于整个电脑屏幕的鼠标位置&#xff0c;转换为相对于当前程序的窗口的位置&#xff0c;然后判断这个坐…

MyBatisPlus_通用service篇_入门试炼_05

文章目录1. service和impl2. 实战1. service和impl package com.gblfy.springboot.mybatisplus.service;import com.baomidou.mybatisplus.extension.service.IService; import com.gblfy.springboot.mybatisplus.entity.User;public interface UserService extends IService&…

SpringCloud微服务如何优雅停机及源码分析 | 技术头条

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;Trust_FreeDom转自&#xff1a;码农沉思录本文主要讨论的是微服务注册…

qt自定义行编辑器,用来加载颜色

提要 自定义行编辑器&#xff0c;点击后弹出颜色选择对话框&#xff0c;选择喜欢的颜色&#xff0c;确认后在行编辑器加载选中的颜色。 效果 选中某一个颜色后&#xff0c;行编辑器中加载所选的颜色。 示例 mylineedit.h #ifndef MYLINEEDIT_H #define MYLINEEDIT_H#inclu…

MyBatisPlus_AR篇_入门试炼_06

文章目录1. 实体类2. 实战1. 实体类 原则&#xff1a;继承Model package com.gblfy.springboot.mybatisplus.entity;import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.exten…

MyBatisPlus_更新篇_入门试炼_03

文章目录1. 实战更新1. 实战更新 package com.gblfy.springboot.mybatisplus.mapper;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.co…

qt使用样式表设置窗口widget为圆角

提要 窗口widget是无法直接通过样式表设置为圆角的&#xff0c;需要在窗口QWidget中拖入控件QFrame&#xff0c;将QFrame设置的和窗口QWidget一样大小&#xff0c;将窗口QWidget中需要的控件拖入到QFrame中。 示例 下面是一个提示工具的窗口。通过它简单的记录一下样式表怎么…

微软 Build 2019:IE 重生,Azure 成主角;华为拟在英剑桥新建半导体研发基地,与ARM做邻居……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go阿联酋联邦政府人工智能部长 …

qt获取当前场景中的所有图形项的层次

提要 场景中有多个窗口&#xff0c;窗口处于不断更新中&#xff0c;获取场景中当前所有窗口的图层。由于特定的结构&#xff0c;这里场景中的窗口采用自定义窗口&#xff0c;将该自定义窗口作为自定义代理窗口的窗口&#xff0c;图形项作为自定义代理窗口的父窗口&#xff0c;…

MyBatisPlus_删除篇_入门试炼_04

文章目录1. 实战删除1. 实战删除 package com.gblfy.springboot.mybatisplus.mapper;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybati…