I am trying to do something like this:
QString string;
// do things...
std::cout << string << std::endl;
but the code doesn't compile. How to output the content of qstring into the console (e.g. for debugging purposes or other reasons)? How to convert QString
to std::string
?
You can use:
QString qs;
// do things
std::cout << qs.toStdString() << std::endl;
It internally uses QString::toUtf8() function to create std::string, so it's Unicode safe as well. Here's reference documentation for QString
.
One of the things you should remember when converting QString
to std::string
is the fact that QString
is UTF-16 encoded while std::string
... May have any encodings.
So the best would be either:
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();
The suggested (accepted) method may work if you specify codec.
See: http://doc.qt.io/qt-5/qstring.html#toLatin1
static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
std::string utf8_text = qs.toUtf8().constData();
So your statement is not correct
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;
. The first is incorrect, the second is perfect. You need an utf8 terminal to test this.
.toStdString()
for me always results in an access violation in the pipe operator, irrespective of the QString
's contents (non-latin1 or not). This is on Qt 4.8.3/MSVC++ 10/Win 7.
If your ultimate aim is to get debugging messages to the console, you can use qDebug().
You can use like,
qDebug()<<string;
which will print the contents to the console.
This way is better than converting it into std::string
just for the sake of debugging messages.
QString qstr;
std::string str = qstr.toStdString();
However, if you're using Qt:
QTextStream out(stdout);
out << qstr;
Best thing to do would be to overload operator<< yourself, so that QString can be passed as a type to any library expecting an output-able type.
std::ostream& operator<<(std::ostream& str, const QString& string) {
return str << string.toStdString();
}
An alternative to the proposed:
QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();
could be:
QString qs;
std::string current_locale_text = qPrintable(qs);
See qPrintable documentation, a macro delivering a const char * from QtGlobal.
-no-stl
-Option set. some more info
The simplest way would be QString::toStdString()
.
You can use this;
QString data;
data.toStdString().c_str();
QString data;
data.toStdString().c_str();
could even throw exception on VS2017 compiler in xstring
~basic_string() _NOEXCEPT
{ // destroy the string
_Tidy_deallocate();
}
the right way ( secure - no exception) is how is explained above from Artyom
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();
Try this:
#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;
Success story sharing
QString::toStdString()
now usesQString::toUtf8()
to perform the conversion, so the Unicode properties of the string will not be lost (qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString).QString::toStdString
, here it is.