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.

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"

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.