2017-05-28 54 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