【问题标题】:QT c++ QSplitter saveState and restoreStateQT c++ QSplitter saveState 和 restoreState
【发布时间】:2020-06-30 17:37:39
【问题描述】:

我有一个拆分器,我想用 JSON 将他的状态保存在文件中。

QJsonObject mainJson;
// here I have to convert QByteArray to QString
mainJson.insert("test", QTextCodec::codecForMib(1015)->toUnicode(ui->splitter->saveState()));

QFile file("test.json");
QTextStream textStream;
file.open(QFile::WriteOnly);
textStream.setDevice(&file);
textStream.setCodec("UTF-8");
textStream << QString(QJsonDocument(mainJson).toJson()).toUtf8();
textStream.flush();
file.close();

但是文件包含这个:

\u0000＀\u0000-\u0000-\u0000Ⰱ\u0000-\u0000\u0000-\u0000-

这样好吗?以及如何将ui-&gt;splitter-&gt;restoreState(...); 转换回QByteArray? PS:我使用来自here的代码

【问题讨论】:

  • 为什么要将QSplitter的状态保存为JSON?
  • @eyllanesc 我在程序中有很多作为 json 的选项,我也想将拆分器状态保存为 json。我想在重新加载后保存拆分器的状态
  • 我建议使用QSettings
  • @Fabio 我不能。我需要保存在文件中
  • QSettings可以保存在文件中,但它使用INI格式

标签: c++ qt


【解决方案1】:

一般的逻辑是把QByteArray转为QString,这种情况下我更喜欢转base64而不是使用unicode的codec来避免压缩和解压的问题。

综合以上情况,解决办法是:

保存:

QJsonObject mainJson;
QByteArray state = spliter->saveState();
mainJson.insert("splitter", QJsonValue(QString::fromUtf8(state.toBase64())));
QFile file("settings.json");
if(file.open(QIODevice::WriteOnly)){
    file.write(QJsonDocument(mainJson).toJson());
    file.close();
}

恢复:

QJsonDocument doc;
QFile file("settings.json");
if(file.open(QIODevice::ReadOnly)){
    doc = QJsonDocument::fromJson(file.readAll());
    file.close();
}
if(doc.isObject()){
    QJsonObject obj = doc.object();
    QByteArray state = QByteArray::fromBase64(obj.value("splitter").toString().toUtf8());
    spliter->restoreState(state);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多