提要

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

思路

关闭程序的时候保存此刻界面按钮的文本,正常情况下只需在程序退出时调用的析构函数的内部实现,将界面所有的按钮文本生成一个文件,在程序下一次启动的时候,读取文件,设置按钮文本。这里需要考虑的是生成的文件的格式,读取文件时保存文件中的按钮文本的数据结构,当然由于按钮的顺序对应着相应的文本,这里采用每个按钮都有相应的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为自适应分辨率时的宽之比和高之比。
这篇文章是之前写的文件,内容可能比乱。

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

  1. ajax如何请求json文件,简单的ajax请求加载外部json文件

    我在学习ajax ....我试图从json文件发出一个基本请求,它与我的index.html位于同一个文件夹中,但由于某种原因它说未定义:(我可以看到错误是可变的人,但我不能赶上为什么它未定义.... ...

  2. UI5:创建.yaml文件报错:无法加载文件 C:\Users\86178\AppData\Roaming\npm\ui5.ps1

    VSCode中执行ui5 init命令时报错: *PS C:\Users\86178\Desktop\APP1> ui5 init ui5 : 无法加载文件 C:\Users\86178\App ...

  3. 如何在NCL(The NCAR Command Language )启动时自动加载自定义的函数和程序

    首先任意建立一个目录存放自定义的程序,例如: $ mkdir ~/MyNCL 然后建立一个环境变量: export NCL_DEF_SCRIPTS_DIR="~/MyNCL" 然后 ...

  4. 让AutoCAD启动时自动加载应用程序

    方法一: 1. 在AutoCAD安装目录找到c:\Program Files\AutoCAD 2006\Support\acad2006.lsp 用记事本打开,在最后加入(下段代码第二行即可,注意路径 ...

  5. AutoCAD.net让AutoCAD启动时自动加载应用程序

    方法一: 1. 在AutoCAD安装目录找到c:\Program Files\AutoCAD 2006\Support\acad2006.lsp 用记事本打开,在最后加入(下段代码第二行即可,注意路径 ...

  6. 天正lisp文件夹_天正启动时加载那些lisp_怎么在启动CAD时自动加载Lisp的工具和插件...

    怎么在启动 CAD 时自动加载 Lisp 的工具和插件 网上有很多非常有用的 CAD 插件, 能给绘图带来很多便利. 这些 工具手动加载后就可以执行, 但每次用的时候都要加载挺麻烦的, 能 不能在启动 ...

  7. qt中生成含有中文的json文件,读取含有中文的json文件

    引言 之前将变量保存并在本地生成json文件,由于其中含有中文,导致生成的json文件出现乱码,或者就是生成的json文件没有乱码,但是读取生成的json文件时出现乱码,不能正常解析json. 示例 ...

  8. Qt和OpenGL:使用Open Asset Import Library(ASSIMP)加载3D模型

    Qt和OpenGL:使用Open Asset Import Library(ASSIMP)加载3D模型 翻译自:https://www.ics.com/blog/qt-and-opengl-loadi ...

  9. android xml 加载错误提示,加载uixml文件失败 打开wps时显示“加载XML文件失败1

    打开wps时显示"加载XML文件失败." 打开wps时显示"加载XML文件失败1 关闭所有打开的Word文档: 开始 → 运行 → 粘贴上面复制的命令 → 确定. 在打开 ...

最新文章

  1. GUID和自增ID的比较_delete
  2. eclipse安装weblogic Server服务器
  3. spring el表达式 if else_vue指令集合:v-for,v-show,v-if等
  4. Linux 错误 Permission denied问题
  5. linux根文件系统创建过程
  6. java 判断qq_Java检测QQ是否在线状态
  7. linux——线程通信(2)
  8. php自动加载什么时候用到,php的自动加载的使用
  9. 计算机硬件中英对照,计算机硬件名称中英文对照表
  10. 解决Ubuntu 9.04无线网络的不稳定问题-转
  11. mysql有哪些特色SQL语句_Linux-MySQL-有哪些常用sql语句
  12. 7.性能之巅 洞悉系统、企业与云计算 --- 内存
  13. NOI.AC NOIP模拟赛 第四场 补记
  14. 三个点在同一个半圆的概率_圆形水池中的四只小鸭子出现在同一个半圆中的概率是?...
  15. 开源的魔兽世界参考架构——mangos--网络游戏引擎BigWorld 服务器介绍
  16. Install load test reports
  17. 最彻底的健身补剂——肌酸!
  18. ns-3中的数据跟踪与采集——Tracing系统的配置
  19. Moodle专题网站链接
  20. 容联云AI科学院研发先进KBQA能力,问鼎大规模中文知识图谱问答权威性测评

热门文章

  1. DLF +DDI 一站式数据湖构建与分析最佳实践
  2. 新基建来了!5G边缘计算如何展现勃勃生机?
  3. 启迪公交上云助力北京公交二维码乘车业务系统顺利上线
  4. 支付宝放出数字化经营新神器,可提升商家60%消费频次
  5. 会向业务“砍需求”的技术同学,该具备哪6点能力?
  6. Mars——基于矩阵的统一分布式计算框架
  7. 为什么大家都在抵制用定时任务实现「关闭超时订单」功能?
  8. 对数据“投入”却没有“产出”?听听 Gartner 的最新分析
  9. 中国开源持续燃烧,给开发者的两点思考
  10. 哈工大人工智能研究院院长刘劼:AIoT 核心在“智”不在“联”,需云边端协同...