2010-11-18 16 views
179

Staram się zrobić coś takiego:Jak przekonwertować QString na std :: string?

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

ale kod nie kompiluje. Jak wyprowadzić zawartość qstring do konsoli (np. Do celów debugowania lub z innych powodów)? Jak przekonwertować QString na std::string?

Odpowiedz

173

Jedną z rzeczy, należy pamiętać przy konwersji QString do std::string jest fakt, że QString jest kodowana w UTF-16 podczas std::string ... Może mieć żadnych kodowania.

Więc najlepiej byłoby albo:

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

Proponowana metoda

(zaakceptowane) może działać, jeśli podasz kodeka.

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

+0

To nie jest bezpieczne i jest nieco wolniejsze niż właściwy sposób. Uzyskujesz dostęp do danych QByteArray utworzonych na stosie. Destruktor dla QByteArray może zostać wywołany przed konstruktorem ciągu STL. Najbezpieczniejszy sposób utworzenia funkcji pomocnika. 'statyczny wbudowany std :: string doUtf8 (stały QString i s) { \t QByteArray sUtf8 = s.toUtf8(); \t return std :: string (sUtf8.constData(), sUtf8.size()); } ' – Vitali

+14

@Vitali nie zgadza się. "Destruktor dla QByteArray może zostać wywołany przed konstruktorem ciągu STL" nie jest poprawnym stwierdzeniem: Cytując standard: 12.2.3 Obiekty tymczasowe są niszczone jako ostatni krok w ocenie pełnego wyrażenia (1.9), który (leksykalnie) zawiera punkt, w którym zostały utworzone. A pełne wyrażenie to 'std :: string utf8_text = qs.toUtf8(). ConstData();' Tak więc twoja instrukcja nie jest poprawna – Artyom

+0

To prawda - myślałem o const char * x = qs.ToUtf8(). ConstData(). Nadal nie jest łatwiej po prostu wywołać qs.toStdString()? – Vitali

202

Można użyć: dokumentację

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

Here's odniesienia dla QString.

+0

Dzięki. To działa. – augustin

+0

I dziękuję za link do dokumentacji. :) – augustin

+0

Brak prob! Powodzenia w QT! –

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

Jednakże, jeśli używasz Qt:

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

Najpierw wypróbowałem << qstr, zanim zapytałem, ale nie skompilowałem. Działa jednak z qstr.toStdString(). – augustin

+1

Nie sądzę. Próbowałeś std :: cout << qstr, nie QTextString (stdout) << qstr; – chris

+0

Oh! Widzę! Spróbuję tego. +1. – augustin

17

Najlepszym rozwiązaniem byłoby przeciążyć operator < < siebie, tak że QString mogą być przekazywane jako typ do każdej biblioteki oczekując typ wyjściowy.

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

Dlaczego głosy na dół, ludzie? W moim przypadku jest to przesada, ale kto wie, może być przydatny (dla mnie lub kogoś innego). – augustin

+2

+1. Dziękuję Ci . – augustin

31

Jeśli ostatecznym celem jest, aby debugowanie wiadomości do konsoli, można użyć qDebug().

Można użyć podobnych

qDebug()<<string; który będzie wydrukować zawartość do konsoli.

Ten sposób jest lepszy niż przekształcenie go w std::string tylko ze względu na debugowanie wiadomości.

+0

+1 Dzięki. qDebug() może okazać się przydatny. – augustin

+1

qDebug() będzie znacznie lepszy, ponieważ obsługuje więcej typów Qt. –

9

Alternatywą proponowana:

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

mogą być:

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

Zobacz qPrintable documentation, makro dostarczaniu const char * od QtGlobal.

+1

działa to nawet z Qt-Build z opcją '-no-stl'-Option. [trochę więcej informacji] (http://asmaloney.com/2011/11/code/qstringtostdstring-qstringfromstdstring-and-no-stl/) – Senad

7

Najprostszym sposobem byłoby string.toStdString()

0

Można to wykorzystać;

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

proszę podać kilka szczegółów na temat tego, na czym polegał błąd i dlaczego odpowiedź działa –

Powiązane problemy