如何将QString转换为std :: string?


229

我正在尝试做这样的事情:

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

但是代码无法编译。如何将qstring的内容输出到控制台(例如出于调试目的或其他原因)?怎么转换QStringstd::string

Answers:


222

转换QString为时应记住的一件事是,...可能是UTF-16编码std::string的事实。QStringstd::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#toLatin1


这是不安全的,并且比正确的方法要慢一些。您正在访问在堆栈上创建的QByteArray的数据。QByteArray的析构函数可以在STL字符串的构造函数之前调用。创建助手功能的最安全方法。 static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
维塔利

17
@Vitali不正确。“可能在STL字符串的构造函数之前调用QByteArray的析构函数”是不正确的说法:引用标准:12.2.3临时对象被销毁是评估(按词法分析)全表达式(1.9)的最后一步包含创建它们的位置。那里的完整表达是,std::string utf8_text = qs.toUtf8().constData();所以您的说法不正确
Artyom

没错-我正在考虑const char * x = qs.ToUtf8()。constData()。仍然,仅调用qs.toStdString()是否更容易?
维塔利

6
@Vitali编号。这会丢失非拉丁字符。试试这个: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终端进行测试。
Notinlist 2011年

3
对于它的价值,.toStdString()对我而言,无论QString的内容是什么(无论是否为latin1),在管道操作员中总是会导致访问冲突。这是Qt的4.8.3 / MSVC ++ 10 /赢7.
丹尼尔理智

269

您可以使用:

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

它内部使用QString :: toUtf8()函数创建std :: string,因此它也是Unicode安全的。这是的参考文档QString


73
从Qt 5.0开始,QString::toStdString()现在用于QString::toUtf8()执行转换,因此不会丢失字符串的Unicode属性(qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString)。
Emile Cormier 2013年

如果您要检查源代码QString::toStdString这里是
thuga 2014年

1
我该如何测试它是否确实丢失了Unicode属性?是否可以使用Unicode字符(例如,使用英语以外的语言说)?
Yousuf Azad

35

如果最终目的是将调试消息发送到控制台,则可以使用qDebug()

你可以这样使用

qDebug()<<string;它将内容打印到控制台

这种方法比std::string仅出于调试消息的目的而将其转换为更好。


1
qDebug()会更好,因为它支持更多的Qt类型。
卡米尔·克里米克

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

但是,如果您使用的是Qt:

QTextStream out(stdout);
out << qstr;

在询问之前,我先尝试了<< qstr,但它没有编译。不过,它可以与qstr.toStdString()一起使用。
奥古斯丁2010年

2
我不这么认为。您尝试了std :: cout << qstr,而不是QTextString(stdout)<< qstr;
克里斯,2010年

18

最好的办法是自己重载operator <<,以便QString可以作为类型传递给任何需要可输出类型的库。

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

3
伙计们为什么要投反对票?就我而言,这是一个过大的杀伤力,但谁知道,它可能对我或其他人有用。
奥古斯丁2010年

我之所以这样,是因为Qt习惯于更改其字符串的工作方式-这将转换放在了一个地方。
丹·杰森

12

提议的替代方案:

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

可能:

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

请参阅qPrintable文档,这是一个从QtGlobal提供const char *的宏。


2
即使-no-stl设置了-Option 的Qt-Build也可以使用。一些更多的信息
Senči



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

甚至可能在xstring的VS2017编译器上引发异常

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

-1

试试这个:

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

1
问题很明确:将QString转换为std :: string,而不是打印出来。
eyllanesc

@eyllanesc问题文本显示“如何将qstring的内容输出到控制台?” ,似乎OP假定转换为std :: string是唯一的方法。一次要问的实际上是两个问题。
MM

@MM这个问题似乎还不清楚,因为标题中的问题表明如何将QString转换为std :: string?,也许是XY问题。
eyllanesc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.