2017-05-28 262 views
0

我需要将QML源代码存储在JSON文件中,以便保存格式(换行符和间距以及whatnot)。我想过以编程方式插入特殊的unicode字符,这些字符在我的源代码中不会用作标记到JSON(保存时)以表示新的行和空格。从JSON读取源代码时,我会用换行符或空格替换这些标记。但是,这并不像一个非常强大的解决方案。将格式化的QML源代码存储在JSON文件中

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

回答

0

您可以使用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()); 
} 

mQmlQString

这接通以下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文件将从压缩中受益。

+1

当你在它的时候,你也可能压缩字节数组以保存在内存中。 – dtech

+0

哦,我甚至不知道有这个功能。谢谢! – Mitch

+0

@dtech'QString(qCompress(mQml.toUtf8()。toBase64(),9))'似乎导致一个空字符串 - 我如何将'QByteArray'转换为'QString',哪个'QJsonObject'需要? – Mitch