QT C++中QSplitter状态JSON存储与恢复问题咨询
QSplitter状态保存与恢复的问题解答
生成的JSON内容是否正常?
首先可以明确:你看到的这些\u0000\u0000Ā...内容是正常的。
原因是QSplitter::saveState()返回的QByteArray是二进制数据,里面包含很多非打印的控制字符。你用QTextCodec::codecForMib(1015)(也就是UTF-16编码)把二进制字节转成Unicode字符串后,JSON序列化时会把这些不可打印的字符自动转义成\uXXXX的Unicode编码形式,所以最终文件里的内容就是这些转义后的字符串——本质是二进制数据的文本化存储,虽然看起来奇怪,但确实是有效的。
不过这种方式其实有点绕,更推荐用Base64编码来存储二进制数据(后面会讲),但先解决你当前的恢复需求。
如何恢复QSplitter状态?
既然你保存时用了UTF-16编码把QByteArray转成了QString,那恢复时只需要反向操作即可:从JSON中取出字符串,再用同一个编码转成QByteArray,然后传给restoreState()。
具体代码示例:
// 读取JSON文件 QFile file("test.json"); if (!file.open(QFile::ReadOnly)) { qDebug() << "Failed to open file!"; return; } QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); file.close(); // 取出保存的状态字符串并转换回QByteArray QJsonObject mainJson = doc.object(); QString stateStr = mainJson.value("test").toString(); QByteArray stateData = QTextCodec::codecForMib(1015)->fromUnicode(stateStr); // 恢复QSplitter状态 ui->splitter->restoreState(stateData);
更优的存储方案(推荐)
二进制数据直接转字符串存JSON容易出现编码问题,也不利于阅读,更合适的方式是用Base64编码,把二进制数据转成可读性更好的ASCII字符串,同时避免编码转换的麻烦。
优化后的保存代码:
QJsonObject mainJson; // 直接将状态的QByteArray转成Base64字符串 mainJson.insert("test", ui->splitter->saveState().toBase64()); QFile file("test.json"); if (file.open(QFile::WriteOnly | QFile::Text)) { QTextStream textStream(&file); textStream.setCodec("UTF-8"); // 生成格式化的JSON,更易读 textStream << QJsonDocument(mainJson).toJson(QJsonDocument::Indented); file.close(); }
对应的恢复代码:
QFile file("test.json"); if (!file.open(QFile::ReadOnly | QFile::Text)) { qDebug() << "Failed to open file!"; return; } QJsonDocument doc = QJsonDocument::fromJson(file.readAll()); file.close(); QJsonObject mainJson = doc.object(); QString base64Str = mainJson.value("test").toString(); // 将Base64字符串解码回QByteArray QByteArray stateData = QByteArray::fromBase64(base64Str.toUtf8()); ui->splitter->restoreState(stateData);
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

