web-dev-qa-db-ja.com

QStringListをQStringにパックし、解凍して戻します

私は、任意のQStringListを単一のQStringに変換して元に戻す簡単で確実な方法を探しています。

QStringList fruits;
fruits << "Banana", "Apple", "Orange";
QString packedFruits = pack(fruits);
QStringList unpackFruits = unpack(packedFruits);

// Should be true 
// fruits == unpackFruits;

この種の問題の最も簡単な解決策は何でしょうか?

9
Aleph0

QStringListからQString - _QStringList::join_

すべての文字列リストの文字列を単一の文字列に結合し、各要素を指定された区切り文字(空の文字列にすることができます)で区切ります。

_QString pack(QStringList const& list)
{
    return list.join(reserved_separator);
}
_

QStringからQStringList - _QString::split_

sepが発生する場所で文字列を部分文字列に分割し、それらの文字列のリストを返します。 sepが文字列のどこにも一致しない場合、split()はこの文字列を含む単一要素のリストを返します。

_QStringList unpack(QString const& string)
{
    return string.split(reserved_separator);
}
_
23
LogicStuff

以前の回答では、_QString::split_と_QStringList::join_が正しい方法であると述べていましたが、選択した区切り文字がいずれかの文字列に含まれていると、変換が失敗します。

次のいずれかの方法で、リスト内の文字列にセパレータが含まれないようにする必要があります。

  • 文字列に区切り文字が含まれている場合は、QStringList :: joinの前にエラーをスローします
  • 区切り文字を含めることができないことを確認します(たとえば、文字列をQByteArray::toHex(myString.toLatin1())表現で格納し、0..9およびa..fの範囲外の文字を持つ区切り文字を使用します。次に変換します。後でQString::fromLatin1(QByteArray::fromHex(myHexString))で戻る
  • 文字列にセパレータが含まれているかどうかに関係なく、任意のセパレータを使用しますが、join()の前にエスケープロジックを実装し、split()の後にエスケープ解除ロジックを実装して、セパレータがその時点でどの文字列にも存在しないようにします。結合しますが、そのすべてのインスタンスが復元されます。
5
FPGA warrior

QStringList :: join() を使用します:

QStringList strList;
strList << "Banana" << "Apple" << "Orange" ;

QString str = strList.join("");  // str = "BananaAppleOrange";
str = strList.join(",");  // str = "Banana,Apple,Orange";
4
IAmInPLS