将格式化的 QML 源代码存储在 JSON 文件中



我需要将QML源代码存储在JSON文件中,以便保留格式(换行符和间距等(。我考虑以编程方式将我永远不会在源代码中使用的特殊 unicode 字符作为标记插入 JSON(保存时(以表示新行和空格。从 JSON 读取源代码时,我会用换行符或空格替换这些标记。但是,这感觉不是一个非常强大的解决方案。

有没有更好的方法可以做到这一点?

您可以使用

QByteArray::toBase64()将 QML 源转换为可保存为 JSON 的字符串:

void SourceCodeSerialiser::read(const QJsonObject &json)
{
    mQml = QByteArray::fromBase64(json["qml"].toString().toUtf8());
}

QByteArray::toBase64()将保存的 Base64 字符串读回 QML 字符串:

void SourceCodeSerialiser::write(QJsonObject &json) const
{
    json["qml"] = QString(mQml.toUtf8().toBase64());
}

( mQml 是一个QString (

这将转换以下 QML:

import QtQuick 2.0
Item {
    id: item
}

进入这个 Base64 字符串:

aW1wb3J0IFF0UXVpY2sgMi4wCgpJdGVtIHsKICAgIGlkOiBpdGVtCn0=

正如@dtech提到的,也可以使用 qCompress()qUncompress() 压缩字节数组以节省一些内存:

void SourceCodeSerialiser::read(const QJsonObject &json)
{
    mQml = qUncompress(QByteArray::fromBase64(json["qml"].toString().toUtf8()));
}
void SourceCodeSerialiser::write(QJsonObject &json) const
{
    json["qml"] = QString(qCompress(mQml.toUtf8(), 9).toBase64());
}

这将生成以下 Base64 字符串:

AAAAKXjay8wtyC8qUQgsCSzNTM5WMNIz4OLyLEnNVajmUgCCzBQrhUwgl6sWABKDDFM=

这比未压缩的版本大,因为 QML 代码段太小了。较大的 QML 文件将受益于压缩。

最新更新