2010-11-18 6 views
179

Я пытаюсь сделать что-то вроде этого:Как преобразовать QString в std :: string?

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

но код не компилируется. Как выводить содержимое qstring в консоль (например, для целей отладки или по другим причинам)? Как конвертировать QString в std::string?

ответ

173

Одна из вещей, которые вы должны помнить при преобразовании QString в std::string является тот факт, что QString является UTF-16 закодированы в то время как std::string ... Может есть какие-кодировок.

Так что лучше будет либо:

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

Предложенное (принят) метод может работать, если указать кодек.

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

+0

Это не безопасно и немного медленнее, чем нужно. Вы получаете доступ к данным QByteArray, созданным в стеке. Деструктор для QByteArray можно вызвать перед конструктором строки STL. Самый безопасный способ создания вспомогательной функции. 'static inline std :: string toUtf8 (const QString & s) { \t QByteArray sUtf8 = s.toUtf8(); \t return std :: string (sUtf8.constData(), sUtf8.size()); } ' – Vitali

+14

@Vitali не правильно. «Деструктор для QByteArray может быть вызван до того, как конструктор строки STL» не является корректным: Quoting the standard: 12.2.3 Временные объекты уничтожаются как последний шаг при оценке полного выражения (1.9), который (лексически) содержит точку, в которой они были созданы. И полное выражение есть 'std :: string utf8_text = qs.toUtf8(). ConstData();' Так что ваш оператор неверен – Artyom

+0

Это правда - я думал о const char * x = qs.ToUtf8(). ConstData(). Тем не менее, не проще ли просто вызвать qs.toStdString()? – Vitali

202

Вы можете использовать:

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

Here's справочную документацию для QString.

+0

Спасибо. Оно работает. – augustin

+0

И спасибо за ссылку на документацию. :) – augustin

+0

Нет проблем! Удачи вам в QT! –

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

Однако, если вы используете Qt:

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

Я сначала пробовал << qstr, прежде чем спрашивать, но он не скомпилировался. Однако он работает с qstr.toStdString(). – augustin

+1

Я так не думаю. Вы пробовали std :: cout << qstr, а не QTextString (stdout) << qstr; – chris

+0

О! Я вижу! Я попробую. +1. – augustin

17

Лучше всего делать будет перегружать оператор < < себя, так что QString может быть принят в качестве типа в любой библиотеке Ожидая выходной тип.

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

Почему пустые голоса, ребята? В моем случае это слишком много, но кто знает, это может быть полезно (мне или кому-то еще). – augustin

+2

+1. Спасибо . – augustin

31

Если ваша конечная цель состоит в том, чтобы получить сообщения отладки на консоли, вы можете использовать qDebug().

Вы можете использовать как,

qDebug()<<string;, который будет печатать содержимое в консоли.

Этот способ лучше, чем преобразование его в std::string только для отладки сообщений.

+0

+1 Спасибо. qDebug() может оказаться удобным. – augustin

+1

qDebug() будет намного лучше, потому что он поддерживает больше типов Qt. –

9

Альтернативой предложенная:

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

может быть:

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

qPrintable documentation См, макрос доставки константный символ * из QtGlobal.

+1

это работает даже с Qt-Build с набором -no-stl'-Option. [some more info] (http://asmaloney.com/2011/11/code/qstringtostdstring-qstringfromstdstring-and-no-stl/) – Senad

7

Самый простой способ будет string.toStdString()

0

Вы можете использовать это;

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

, пожалуйста, добавьте подробную информацию о том, что было ошибкой и почему ваш ответ работает –

Смежные вопросы