Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上
提要
當(dāng)程序關(guān)閉后再次打開程序需要加載上一次的按鈕名稱設(shè)置。
思路
關(guān)閉程序的時(shí)候保存此刻界面按鈕的文本,正常情況下只需在程序退出時(shí)調(diào)用的析構(gòu)函數(shù)的內(nèi)部實(shí)現(xiàn),將界面所有的按鈕文本生成一個(gè)文件,在程序下一次啟動(dòng)的時(shí)候,讀取文件,設(shè)置按鈕文本。這里需要考慮的是生成的文件的格式,讀取文件時(shí)保存文件中的按鈕文本的數(shù)據(jù)結(jié)構(gòu),當(dāng)然由于按鈕的順序?qū)?yīng)著相應(yīng)的文本,這里采用每個(gè)按鈕都有相應(yīng)的id和index來標(biāo)識,以找到對應(yīng)的文本。
數(shù)據(jù)解構(gòu)
其中index表示是第幾個(gè)按鈕,id表示對應(yīng)文本的按鈕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文件的結(jié)構(gòu)中,第一個(gè)按鈕的文本為場景8,按鈕的id為10008,依次類推。
也就是關(guān)閉程序的時(shí)候,需在析構(gòu)函數(shù)中生成該格式的json文件。
生成json文件,其中變量m_btnInfoMap是用來保存界面按鈕的文本的容器,QMap<int,stuSceNameId> m_btnInfoMap;//保存按鈕的文本,id,按鈕下標(biāo),以按鈕下標(biāo)為鍵
struct stuSceNameId {QString name;int id; }; //以上結(jié)構(gòu)體僅作為類型說明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轉(zhuǎn)換為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(); }啟動(dòng)程序時(shí)讀取json文件解析json,保存到內(nèi)存中,設(shè)置按鈕文本。
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類型變量轉(zhuǎn)換為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類型變量轉(zhuǎn)換為utf-8編碼的QString變量file.close(); #ifdef OUT_PUT // outPut<<"json文件內(nèi)容:"<<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();} }//創(chuàng)建按鈕 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);//查找下標(biāo)對應(yīng)的按鈕名稱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);參數(shù)i+1為index,即按鈕的個(gè)數(shù),從1開始,ui->backgroundwidget為父控件,SCENEBTN_NUM為宏定義,一個(gè)指定的數(shù)字,m_percentW和m_percentH為自適應(yīng)分辨率時(shí)的寬之比和高之比。
這篇文章是之前寫的文件,內(nèi)容可能比亂。
總結(jié)
以上是生活随笔為你收集整理的Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 最大值 关联_mysql-关
- 下一篇: 智能机器人建房子后房价走势_深圳建二手房