【发布时间】:2011-05-11 23:48:10
【问题描述】:
我正在尝试做这样的事情:
QString string;
// do things...
std::cout << string << std::endl;
但代码无法编译。
如何将 qstring 的内容输出到控制台(例如出于调试目的或其他原因)?如何将QString 转换为std::string?
【问题讨论】:
标签: c++ qt type-conversion qstring
我正在尝试做这样的事情:
QString string;
// do things...
std::cout << string << std::endl;
但代码无法编译。
如何将 qstring 的内容输出到控制台(例如出于调试目的或其他原因)?如何将QString 转换为std::string?
【问题讨论】:
标签: c++ qt type-conversion qstring
你可以使用:
QString qs;
// do things
std::cout << qs.toStdString() << std::endl;
它在内部使用 QString::toUtf8() 函数来创建 std::string,所以它也是 Unicode 安全的。 Here'sQString 的参考文档。
【讨论】:
QString::toStdString() 现在使用 QString::toUtf8() 执行转换,因此字符串的 Unicode 属性不会丢失 (qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString)。
QString::toStdString的源代码,here it is。
试试这个:
#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;
【讨论】:
QString data;
data.toStdString().c_str();
~basic_string() _NOEXCEPT
{ // destroy the string
_Tidy_deallocate();
}
正确的方法(安全 - 也不例外)是上面来自 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();
【讨论】:
最简单的方法是QString::toStdString()。
【讨论】:
建议的替代方案:
QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();
可能是:
QString qs;
std::string current_locale_text = qPrintable(qs);
参见qPrintable documentation,这是一个从 QtGlobal 传递 const char * 的宏。
【讨论】:
-no-stl-Option 集的Qt-Build。 some more info
将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();
如果您指定编解码器,建议(接受)的方法可能会起作用。
【讨论】:
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(); 所以你的说法不正确
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;。第一个是错误的,第二个是完美的。你需要一个 utf8 终端来测试它。
.toStdString() 总是会导致管道操作员的访问冲突,无论QString 的内容如何(非拉丁1 与否)。这是在 Qt 4.8.3/MSVC++ 10/Win 7 上。
如果您的最终目标是将调试消息发送到控制台,您可以使用qDebug()。
你可以用like,
qDebug()<<string; 会将内容打印到控制台。
这种方式比仅仅为了调试消息而将其转换为std::string要好。
【讨论】:
你可以用这个;
QString data;
data.toStdString().c_str();
【讨论】:
最好的办法是自己重载 operator
std::ostream& operator<<(std::ostream& str, const QString& string) {
return str << string.toStdString();
}
【讨论】:
QString qstr;
std::string str = qstr.toStdString();
但是,如果您使用的是 Qt:
QTextStream out(stdout);
out << qstr;
【讨论】: