ChatGPT解决这个技术问题 Extra ChatGPT

How to convert QString to std::string?

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?


t
tunafish24

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.


As of Qt 5.0, QString::toStdString() now uses QString::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).
And if you want to check the source code for QString::toStdString, here it is.
How can i test to see if it indeed loses the Unicode property? Will using Unicode characters(e.g. say from a language other than English) will do?
Z
Zhigalin - Reinstate CMs

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


This isn't safe & is slightly slower than the proper way. You're accessing the data of a QByteArray created on the stack. The destructor for the QByteArray may be called before the constructor of the STL string. The safest way to create a helper function. static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
@Vitali not correct. "The destructor for the QByteArray may be called before the constructor of the STL string" is not correct statement: Quoting the standard: 12.2.3 Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. And the full expression there is std::string utf8_text = qs.toUtf8().constData(); So your statement is not correct
That's true - I was thinking about const char *x = qs.ToUtf8().constData(). Still, isn't it easier to just call qs.toStdString()?
@Vitali No. That loses non-latin1 characters. Try this: 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.
For what it's worth, .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.
Z
Zhigalin - Reinstate CMs

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.


qDebug() would be much better, because it supports more Qt types.
c
chris
QString qstr;
std::string str = qstr.toStdString();

However, if you're using Qt:

QTextStream out(stdout);
out << qstr;

I had tried out << qstr first, before asking, but it didn't compile. It works with qstr.toStdString(), though.
I don't think so. You tried std::cout << qstr, not QTextString(stdout) << qstr;
P
Puppy

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

Why the down votes, folks? It's an overkill in my case, but who knows, it might be useful (to me or someone else).
I like this because Qt have a habit of changing the way their strings work - and this puts the conversion in one place.
Z
Zhigalin - Reinstate CMs

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.


this works even with a Qt-Build with -no-stl-Option set. some more info
c
cbuchart

The simplest way would be QString::toStdString().


H
Hafsa Elif Özçiftci

You can use this;

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

please add some details as to what the mistake was and why your answer works
J
JPM
 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();

b
bunbun

Try this:

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

The question is very clear: convert QString to std::string, not to print it.
@eyllanesc the question text says "How to output the content of qstring into the console?" , it seems OP assumes converting to std::string is the only way. It's really two questions being asked at once .
@M.M The question seems unclear since the question in the title says How to convert QString to std::string?, Maybe it's an XY problem.