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

本文档详细介绍了如何在程序关闭和重新打开时保持按钮名称设置。通过在程序关闭时保存界面按钮的文本到JSON文件,然后在启动时读取并设置按钮文本,实现了状态的持久化。文中提供了生成和解析JSON文件的代码示例,涉及到数据结构、文件操作以及自定义按钮类的使用。
摘要由CSDN通过智能技术生成

提要

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

思路

关闭程序的时候保存此刻界面按钮的文本,正常情况下只需在程序退出时调用的析构函数的内部实现,将界面所有的按钮文本生成一个文件,在程序下一次启动的时候,读取文件,设置按钮文本。这里需要考虑的是生成的文件的格式,读取文件时保存文件中的按钮文本的数据结构,当然由于按钮的顺序对应着相应的文本,这里采用每个按钮都有相应的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转换为gbk
        array.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文件中编码为gbk
    in<<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_PUT
    outPut<<"文件路径及名称:"<<fileName;
#endif
   QTextCodec *code = QTextCodec::codecForName("GBK");
   QFile file(fileName);
   if (!file.open(QIODevice::ReadOnly))
   {
#ifdef OUT_PUT
       outPut<<QString("%1配置文件读取失败!").arg(fileName);
#endif
       return allData;
   }
   allData = file.readAll();
   QString str = code->toUnicode(allData);//gbk编码的QByteArray类型变量转换为utf-8编码的QString变量
   file.close();
#ifdef OUT_PUT
//   outPut<<"json文件内容:"<<allData;
#endif
   return 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为自适应分辨率时的宽之比和高之比。
这篇文章是之前写的文件,内容可能比乱。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肩上风骋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值