Wie konvertiere ich QString in std :: string?

229

Ich versuche so etwas zu tun:

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

Der Code wird jedoch nicht kompiliert. Wie kann der Inhalt von qstring in die Konsole ausgegeben werden (z. B. zu Debugging-Zwecken oder aus anderen Gründen)? Wie konvertiere ich QStringzu std::string?

Augustin
quelle

Antworten:

221

Eines der Dinge, an die Sie bei der Konvertierung denken sollten QString, std::stringist die Tatsache, dass QStringUTF-16 codiert ist, während std::string... möglicherweise Codierungen vorhanden sind.

Das Beste wäre also 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 (akzeptierte) Methode funktioniert möglicherweise, wenn Sie einen Codec angeben.

Siehe: http://doc.qt.io/qt-5/qstring.html#toLatin1

Artyom
quelle
Dies ist nicht sicher und 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, um eine Hilfsfunktion zu erstellen. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
Vitali
17
@Vitali nicht korrekt. "Der Destruktor für das QByteArray kann vor dem Konstruktor der STL-Zeichenfolge aufgerufen werden" ist keine korrekte Aussage: Zitieren des Standards: 12.2.3 Temporäre Objekte werden als letzter Schritt bei der Bewertung des vollständigen Ausdrucks (1.9) zerstört, der (lexikalisch) enthält den Punkt, an dem sie erstellt wurden. Und der vollständige Ausdruck dort ist std::string utf8_text = qs.toUtf8().constData();Also ist Ihre Aussage nicht korrekt
Artyom
Das stimmt - ich habe über const char * x = qs.ToUtf8 (). ConstData () nachgedacht. Ist es nicht einfacher, einfach qs.toStdString () aufzurufen?
Vitali
6
@Vitali Nein. Das verliert nicht-lateinische1 Zeichen. Versuchen Sie Folgendes : QString s = QString::fromUtf8("árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"); std::cout << s.toStdString() << std::endl; std::cout << s.toUtf8().constData() << std::endl;. Der erste ist falsch, der zweite ist perfekt. Sie benötigen ein utf8-Terminal, um dies zu testen.
Notinlist
3
Für das, was es wert ist, führt es .toStdString()für mich immer zu einer Zugriffsverletzung beim Pipe-Betreiber, unabhängig vom QStringInhalt des (nicht-lateinischen1 oder nicht). Dies ist auf Qt 4.8.3 / MSVC ++ 10 / Win 7.
Daniel Saner
269

Sie können verwenden:

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

Es verwendet intern die Funktion QString :: toUtf8 (), um std :: string zu erstellen, sodass es auch Unicode-sicher ist. Hier ist die Referenzdokumentation für QString.

Pablo Santa Cruz
quelle
73
Ab Qt 5.0 wird QString::toStdString()jetzt QString::toUtf8()die Konvertierung durchgeführt, damit die Unicode-Eigenschaften der Zeichenfolge nicht verloren gehen ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Emile Cormier
Und wenn Sie den Quellcode überprüfen möchten QString::toStdString, finden Sie ihn hier .
Thuga
1
Wie kann ich testen, ob die Unicode-Eigenschaft tatsächlich verloren geht? Wird die Verwendung von Unicode-Zeichen (z. B. aus einer anderen Sprache als Englisch) ausreichen?
Yousuf Azad
35

Wenn Ihr letztendliches Ziel darin besteht, Debugging-Nachrichten an die Konsole zu senden, können Sie qDebug () verwenden .

Sie können wie verwenden,

qDebug()<<string;Dadurch wird der Inhalt auf der Konsole gedruckt .

Dieser Weg ist besser, als ihn std::stringnur zum Debuggen von Nachrichten zu konvertieren .

liaK
quelle
1
qDebug () wäre viel besser, da es mehr Qt-Typen unterstützt.
Kamil Klimek
24
QString qstr;
std::string str = qstr.toStdString();

Wenn Sie jedoch Qt verwenden:

QTextStream out(stdout);
out << qstr;
chris
quelle
Ich hatte << qstr zuerst ausprobiert, bevor ich gefragt habe, aber es wurde nicht kompiliert. Es funktioniert jedoch mit qstr.toStdString ().
August
2
Das glaube ich nicht. Sie haben versucht, std :: cout << qstr, nicht QTextString (stdout) << qstr;
Chris
18

Am besten überladen Sie den Operator << selbst, damit QString als Typ an jede Bibliothek übergeben werden kann, die einen ausgabefähigen Typ erwartet.

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}
Hündchen
quelle
3
Warum die Abstimmungen, Leute? In meinem Fall ist es ein Overkill, aber wer weiß, es könnte nützlich sein (für mich oder jemand anderen).
August
Ich mag das, weil Qt die Angewohnheit hat, die Funktionsweise ihrer Saiten zu ändern - und dies bringt die Konvertierung an einen Ort.
Den-Jason
12

Eine Alternative zum vorgeschlagenen:

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

könnte sein:

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

Siehe qPrintable-Dokumentation , ein Makro, das ein const char * von QtGlobal liefert.

flokk
quelle
2
Dies funktioniert auch mit einem Qt-Build mit -no-stl-Option-Set. einige weitere Informationen
Senči
8

Der einfachste Weg wäre QString::toStdString().

rasieren
quelle
2

Sie können dies verwenden;

QString data;
data.toStdString().c_str();
Hafsa Elif Özçiftci
quelle
Bitte fügen Sie einige Details hinzu, was der Fehler war und warum Ihre Antwort funktioniert
Anantha Raju C
0
 QString data;
   data.toStdString().c_str();

könnte sogar eine Ausnahme auf dem VS2017-Compiler in xstring auslösen

 ~basic_string() _NOEXCEPT
        {   // destroy the string
        _Tidy_deallocate();
        }

Der richtige Weg (sicher - keine Ausnahme) ist, wie oben von Artyom erklärt

 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();
JPM
quelle
-1

Versuche dies:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;
Wudongliang
quelle
1
Die Frage ist sehr klar: Konvertieren Sie QString in std :: string, nicht um es zu drucken.
eyllanesc
@eyllanesc Der Fragentext lautet "Wie wird der Inhalt von qstring in die Konsole ausgegeben?" Es scheint, dass OP davon ausgeht, dass die Konvertierung in std :: string der einzige Weg ist. Es sind wirklich zwei Fragen, die gleichzeitig gestellt werden.
MM
@MM Die Frage scheint unklar, da die Frage im Titel lautet: Wie konvertiere ich QString in std :: string? Vielleicht ist es ein XY-Problem.
eyllanesc