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?

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


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.


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 .


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;

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();
}

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.


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



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();

-1

Versuche dies:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;

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
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.