2017-05-28 4 views
0

フォーマット(改行とスペースなど)が保存されるように、QMLソースコードをJSONファイルに保存する必要があります。私は、新しい行とスペースを表すためにJSON(保存時)にマーカとしてソースコードで使用しない特別なUnicode文字をプログラムで挿入することを考えました。 JSONからソースコードを読むときは、これらのマーカーを改行またはスペースに置き換えます。しかし、これは非常に強固な解決策のようには感じられません。フォーマットされたQMLソースコードをJSONファイルに保存

これを行うより良い方法はありますか?

答えて

0

あなたはJSONに保存することができ、文字列にQMLのソースを変換するQByteArray::toBase64()を使用することができますバックQMLの文字列に保存されたBase64文字列を読み取るために

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

そしてQByteArray::toBase64()

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

これは、次のQMLをオン

mQmlQStringある):

このBase64文字列に
import QtQuick 2.0 

Item { 
    id: item 
} 

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'に変換するにはどうすればいいですか? – Mitch

関連する問題