Wie ändere ich einen String in QString?

152

Was ist der einfachste Weg, dies zu tun?

Nie wieder
quelle

Antworten:

152

Wenn Sie mit Zeichenfolge meinen std::string, können Sie dies mit dieser Methode tun:

QString QString :: fromStdString (const std :: string & str)

std::string str = "Hello world";
QString qstr = QString::fromStdString(str);

Wenn Sie mit Zeichenfolge Ascii-codiert meinen, const char *können Sie diese Methode verwenden:

QString QString :: fromAscii (const char * str, int size = -1)

const char* str = "Hello world";
QString qstr = QString::fromAscii(str);

Wenn Sie const char *mit einer Systemcodierung codiert haben, die mit QTextCodec :: codecForLocale () gelesen werden kann, sollten Sie diese Methode verwenden:

QString QString :: fromLocal8Bit (const char * str, int size = -1)

const char* str = "zażółć gęślą jaźń";      // latin2 source file and system encoding
QString qstr = QString::fromLocal8Bit(str);

Wenn Sie const char *UTF8-codiert haben , müssen Sie diese Methode verwenden:

QString QString :: fromUtf8 (const char * str, int size = -1)

const char* str = read_raw("hello.txt"); // assuming hello.txt is UTF8 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const char*
QString qstr = QString::fromUtf8(str);

Es gibt auch eine Methode zum const ushort *Enthalten von UTF16-codierten Zeichenfolgen:

QString QString :: fromUtf16 (const ushort * Unicode, int size = -1)

const ushort* str = read_raw("hello.txt"); // assuming hello.txt is UTF16 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const ushort*
QString qstr = QString::fromUtf16(str);
Kamil Szot
quelle
1
Sie möchten den QString nicht mit "new" erstellen.
Rohanpm
@ Rohan - Vielen Dank für Ihren Kommentar. Ich entferne dies aus meiner Antwort.
Kamil Szot
Es beantwortet die Frage nicht.
CCoder
1
Ich habe noch nie eine akzeptierte Antwort mit so vielen Abstimmungen gesehen. Warum bearbeitet der Autor es nicht in etwas Besserem als der am höchsten bewerteten Antwort? Möchten Sie weitere Details hinzufügen? Bis dahin genießen Sie noch eine -1.
Tomáš Zato - Wiedereinsetzung Monica
3
Scheint, dass es jetzt behoben ist und ziemlich gut ist, also habe ich sowohl dieses als auch das andere +1 gegeben.
CSL
242

Wenn mit STL-Kompatibilität kompiliert, QStringverfügt eine statische Methode zum Konvertieren von a std::stringin a QString:

std::string str = "abc";
QString qstr = QString::fromStdString(str);
etw
quelle
3
Dies sollte meiner Meinung nach eigentlich vermieden werden. Wenn sich die Version der Standardbibliothek, mit der QT kompiliert wurde, irgendwie von der Version unterscheidet, mit der Sie kompilieren, werden Sie Probleme haben. In erzeugt eine unnötige Abhängigkeit zwischen QT und libstdc ++, die nirgendwo anders in QT existiert.
Shoosh
@shoosh: Um das zu vermeiden, konnte man das nicht einfach tun QString qstr = QString(str.c_str());? Nicht sicher, ob QStringkopiert wird, was darin übergeben wurde.
Claudiu
@shoosh: Ich verstehe Ihre Bedenken hinsichtlich der Kompatibilität, aber sowohl QString als auch std :: string können Nullzeichen enthalten. fromStdStringwird diese bewahren, aus .c_strnicht konstruieren . (Und genau das hat mich zu dieser Frage geführt.)
Martin Bonner unterstützt Monica
@MartinBonner QByteArray hat einen ctor, der const char * und Länge akzeptiert. QString hat einen Ctor, der QByteArray nimmt
shoosh
13

Alternativer Weg:

std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());

Dies hat den Vorteil, dass .c_str()das Gerät nicht verwendet wird, was dazu führen kann std::string, dass es sich selbst kopiert, falls '\0'am Ende kein Platz zum Hinzufügen vorhanden ist .

shoosh
quelle
2
Vielen Dank für den Hinweis auf die mögliche versteckte Kopie mit .c_str ().
Trass3r
Mit c ++ 11 ist dies kein Problem mehr (versteckte Kopie mit .c_str())
Steve Lorimer
1
Vor C ++ 11 war die potenzielle versteckte Kopie eine rein theoretische Möglichkeit - keine Implementierung hat dies tatsächlich getan.
Martin Bonner unterstützt Monica
11
std::string s = "Sambuca";
QString q = s.c_str();

Warnung: Dies funktioniert nicht, wenn das s std::stringenthält \0.

wilhelmtell
quelle
3

Ich bin auf diese Frage gestoßen, weil ich beim Befolgen der Antworten ein Problem hatte. Deshalb poste ich meine Lösung hier.

Die obigen Beispiele zeigen alle Beispiele mit Zeichenfolgen, die nur ASCII-Werte enthalten. In diesem Fall funktioniert alles einwandfrei. Wenn Sie jedoch mit Zeichenfolgen in Windows arbeiten, die auch andere Zeichen enthalten können, z. B. deutsche Umlaute, funktionieren diese Lösungen nicht

Der einzige Code, der in solchen Fällen korrekte Ergebnisse liefert, ist

std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());

Wenn Sie sich nicht mit solchen Zeichenfolgen befassen müssen, funktionieren die obigen Antworten einwandfrei.

Devolus
quelle
Dies hängt nicht von std :: string ab, sondern von der Codierung Ihrer Quelldatei mit dem String-Literal. Wenn Ihre Quelldatei UTF8 ist, wird es funktionieren, aber brechen Sie Ihren Anruf anfromLocal8Bit()
namezero
0

Darüber hinaus können Sie die QVariant-Klasse verwenden, um alles zu konvertieren, was Sie möchten.

beispielsweise:

std::string str("hello !");
qDebug() << QVariant(str.c_str()).toString();
int test = 10;
double titi = 5.42;
qDebug() << QVariant(test).toString();
qDebug() << QVariant(titi).toString();
qDebug() << QVariant(titi).toInt();

Ausgabe

"hello !"
"10"
"5.42"
5
Gabriel de Grimouard
quelle
0

Meinen Sie eine C-Zeichenfolge wie in einer char*Zeichenfolge oder ein C ++ - std::stringObjekt?

In beiden Fällen verwenden Sie denselben Konstruktor, wie in der QT-Referenz dokumentiert:

Verwenden Sie für eine reguläre C-Zeichenfolge einfach den Hauptkonstruktor:

char name[] = "Stack Overflow";
QString qname(name);

Für a std::stringerhalten Sie das char*an den Puffer und übergeben es an den QStringKonstruktor:

std::string name2("Stack Overflow");
QString qname2(name2.c_str());
Gavinb
quelle
1
Richtig, obwohl das OP eingebettete NULL-Werte nicht erwähnte. Wenn dies erforderlich ist, können Sie QByteArray::QByteArray (const char* data, int size)den Puffer zuerst umschließen und dann an den QStringKonstruktor übergeben.
Gavinb