Qt. Holen Sie sich einen Teil von QString

75

Ich möchte QStringvon einem anderen bekommen QString, wenn ich die notwendigen Indizes kenne. Zum Beispiel: Hauptzeichenfolge: "Dies ist eine Zeichenfolge" . Ich möchte QStringaus den ersten 5 Symbolen neue erstellen und "This" erhalten .
Eingabe: erste und letzte Zeichennummer.
Ausgabe: neu QString.

Wie erstelle ich es?

PS Nicht nur die ersten Buchstaben, auch aus der Mitte der Zeile, zum Beispiel von 5 bis 8.

AlekseyS
quelle

Antworten:

111

Wenn Sie den Teilstring nicht ändern müssen, können Sie ihn verwenden QStringRef. Die QStringRefKlasse ist ein schreibgeschützter Wrapper um einen vorhandenen QString, der auf einen Teilstring innerhalb des vorhandenen Strings verweist. Dies bietet eine viel bessere Leistung als das Erstellen eines neuen QStringObjekts, das die Unterzeichenfolge enthält. Z.B

QString myString("This is a string");
QStringRef subString(&myString, 5, 2); // subString contains "is"

Wenn Sie benötigen den Teil zu ändern, dann left(), mid()und right()das tun , was Sie brauchen ...

QString myString("This is a string");
QString subString = myString.mid(5,2); // subString contains "is"
subString.append("n't"); // subString contains "isn't"
Alan
quelle
1
In Ihrem zweiten Beispiel können Sie Folgendes tun: QStringRef subString = myString.midRef (5,2);
Keith
2
Beachten Sie, dass die Verwendung QStringRefeine Optimierung ist, die mit zusätzlicher Komplexität verbunden ist. Es ist sicherer und einfacher, a zu verwenden, es sei denn, Sie führen umfangreiche String-Manipulationen durch und profitieren tatsächlich von der Optimierung (in den meisten Fällen nicht) QString.
Laurent
Aber wenn ich ein Qlabel als Text verwenden möchte, muss ich es in QString umwandeln? Oder gibt es eine Möglichkeit, QStringRef direkt zu verwenden?
user1767754
1
@ this.lau_ Ich erinnere mich, dass Java-Teilzeichenfolgen standardmäßig alle auf diese Weise funktionierten, aber später, nachdem sie Fälle gesehen hatten, in denen eine kleine Teilzeichenfolge einer großen Zeichenfolge verhinderte, dass die große Zeichenfolge Müll sammelte, wurde dieses Verhalten beseitigt.
Andy
1
@Andy, in Qt ist das Verhalten etwas anders - der QString, auf den QStringRef verweist, wird möglicherweise gelöscht. In diesem Fall wird der QStringRef ungültig. Deshalb lohnt sich die zusätzliche Komplexität oft nicht. Um das Dokument zu zitieren:We suggest that you only use this class in stable code where profiling has clearly identified that performance improvements can be made by replacing standard string operations with the optimized substring handling provided by this class.
Laurent
49

Verwenden Sie die leftFunktion:

QString yourString = "This is a string";
QString leftSide = yourString.left(5);
qDebug() << leftSide; // output "This "

Schauen mid()Sie sich auch an, ob Sie mehr Kontrolle wünschen.

Laurent
quelle