13
votes

I'm in search for an easy and foolproof way to convert an arbitrary QStringList to a single QString and back.

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

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

What might be the easiest solution for this kind of problem?

3

3 Answers

28
votes

From QStringList to QString - QStringList::join:

Joins all the string list's strings into a single string with each element separated by the given separator (which can be an empty string).

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

From QString to QStringList - QString::split:

Splits the string into substrings wherever sep occurs, and returns the list of those strings. If sep does not match anywhere in the string, split() returns a single-element list containing this string.

QStringList unpack(QString const& string)
{
    return string.split(reserved_separator);
}
6
votes

Previous answers mentioned QString::split and QStringList::join which is the correct way, but if the separator you choose is included in any of the strings it will break your conversion.

You must prevent strings in the list to contain your separator with one of the following techniques:

  • Throw an error before QStringList::join if any string includes the separator
  • Ensure they can not contain the separator (for example storing the string with its QByteArray::toHex(myString.toLatin1()) representation, then using a separator that has character(s) outside of the range 0..9 and a..f. Then convert back with QString::fromLatin1(QByteArray::fromHex(myHexString)) afterward
  • Use any separator regardless if the strings contain it, but implement an escape logic for it before the join(), and an un-escape logic after the split(), so that the separator is never present in any of the strings at the time of join, but all instances of it will be restored.
5
votes

Use QStringList::join() :

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

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