You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:12:37