2010-11-18 16 views
179

Ich versuche, so etwas zu tun:Wie konvertiert man QString in std :: string?

QString string; 
// do things... 
std::cout << string << std::endl; 

aber der Code nicht kompiliert. Wie wird der Inhalt von qstring in die Konsole ausgegeben (z. B. für Debugging-Zwecke oder aus anderen Gründen)? Wie rechnet man QString in std::string um?

Antwort

173

Eines der Dinge, die Sie sollten daran denken, wenn QString zu std::string Umwandlung ist die Tatsache, dass QString ist UTF-16, während std::string codiert ... alle Codierungen haben.

So wäre die beste entweder:

QString qs; 

// Either this if you use UTF-8 anywhere 
std::string utf8_text = qs.toUtf8().constData(); 

// or this if you're on Windows :-) 
std::string current_locale_text = qs.toLocal8Bit().constData(); 

Die vorgeschlagene (angenommen) Methode arbeiten können, wenn Sie Codec angeben.

See: http://doc.qt.io/qt-5/qstring.html#toAscii

+0

Dies ist nicht sicher und ist etwas langsamer als der richtige Weg. Sie greifen auf die Daten eines QByteArray zu, das auf dem Stapel erstellt wurde. Der Destruktor für das QByteArray kann vor dem Konstruktor der STL-Zeichenfolge aufgerufen werden. Der sicherste Weg, eine Hilfsfunktion zu erstellen. 'statisch inline std :: string toUtf8 (const QString & s) { \t QByteArray sUtf8 = s.toUtf8(); \t Rückgabe std :: string (sUtf8.constData(), sUtf8.size()); } ' – Vitali

+14

@Vitali nicht korrekt. "Der Destruktor für das QByteArray kann vor dem Konstruktor des STL-Strings aufgerufen werden" ist nicht korrekt Aussage: Den Standard zitieren: 12.2.3 Temporäre Objekte werden als letzter Schritt bei der Auswertung des Volltextes (1.9) zerstört, der (lexikalisch) enthält den Punkt, an dem sie erstellt wurden. Und der volle Ausdruck dort ist 'std :: string utf8_text = qs.toUtf8(). ConstData();' Deine Aussage ist also nicht korrekt – Artyom

+0

Das stimmt - ich dachte über const char * x = qs.ToUtf8(). ConstData(). Ist es nicht einfacher, einfach qs.toStdString() aufzurufen? – Vitali

202

können Sie verwenden:

QString qs; 
// do things 
std::cout << qs.toStdString() << std::endl; 

Here's Referenzdokumentation für QString.

+0

Danke. Es klappt. – augustin

+0

Und danke für den Link zu der Dokumentation. :) – augustin

+0

Kein Problem! Viel Glück mit QT! –

21
QString qstr; 
std::string str = qstr.toStdString(); 

Wenn Sie jedoch Qt verwenden:

QTextStream out(stdout); 
out << qstr; 
+0

Ich hatte zuerst << qstr ausprobiert, bevor ich gefragt habe, aber es kompiliert nicht. Es funktioniert jedoch mit qstr.toStdString(). – augustin

+1

Ich glaube nicht. Sie haben versucht std :: cout << qstr, nicht QTextString (stdout) << qstr; – chris

+0

Oh! Aha! Ich werde es versuchen. +1. – augustin

17

Das Beste, was zu tun wäre, Betreiber < < selbst zu überlasten, so dass QString kann als eine Art zu jeder Bibliothek übergeben wird erwartet ein Ausgabetyp.

std::ostream& operator<<(std::ostream& str, const QString& string) { 
    return str << string.toStdString(); 
} 
+3

Warum die Down-Stimmen, Leute? Es ist ein Overkill in meinem Fall, aber wer weiß, könnte es nützlich sein (für mich oder jemand anderes). – augustin

+2

+1. Danke . – augustin

31

Wenn Ihr Endziel Debug-Meldungen an die Konsole zu erhalten, können Sie qDebug() verwenden.

Sie mögen können,

qDebug()<<string; die den Inhalt in die Konsole gedruckt wird.

Dieser Weg ist besser, als es in std::string nur aus Gründen der Fehlersuche zu konvertieren.

+0

+1 Danke. qDebug() könnte sich als nützlich erweisen. – augustin

+1

qDebug() wäre viel besser, weil es mehr Qt-Typen unterstützt. –

9

Eine Alternative zu den vorgeschlagenen:

QString qs; 
std::string current_locale_text = qs.toLocal8Bit().constData(); 

könnte sein:

QString qs; 
std::string current_locale_text = qPrintable(qs); 

qPrintable documentation Siehe, ein Makro ein const char * von QtGlobal liefern.

+1

dies funktioniert sogar mit einem Qt-Build mit '-no-stl'-Optionssatz. [weitere Informationen] (http://asmaloney.com/2011/11/code/qstringtoststtring-qstringfromstdstring-and-no-stl/) – Senad

7

Der einfachste Weg wäre string.toStdString()

0

Sie können diese nutzen;

QString data; 
data.toStdString().c_str(); 
+0

Bitte fügen Sie einige Details hinzu, was der Fehler war und warum Ihre Antwort funktioniert –

Verwandte Themen