ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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


t
tunafish24

您可以使用:

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

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


从 Qt 5.0 开始,QString::toStdString() 现在使用 QString::toUtf8() 执行转换,因此字符串的 Unicode 属性不会丢失 (qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString)。
如果您想查看 QString::toStdString 的源代码,here it is
我如何测试它是否确实丢失了 Unicode 属性?使用 Unicode 字符(例如说英语以外的语言)可以吗?
Z
Zhigalin - Reinstate CMs

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#toLatin1


这不安全&比正确的方式稍慢。您正在访问在堆栈上创建的 QByteArray 的数据。 QByteArray 的析构函数可以在 STL 字符串的构造函数之前调用。创建辅助函数的最安全方法。 static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
@Vitali 不正确。 “QByteArray 的析构函数可能在 STL 字符串的构造函数之前被调用”不是正确的陈述:引用标准:12.2.3 临时对象被销毁作为评估完整表达式(1.9)的最后一步(词法上)包含它们的创建点。完整的表达式是 std::string utf8_text = qs.toUtf8().constData(); 所以你的陈述是不正确的
没错——我在考虑 const char *x = qs.ToUtf8().constData()。不过,调用 qs.toStdString() 不是更容易吗?
@Vitali 不,这会丢失非 latin1 字符。试试这个: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 的内容(非 latin1 与否)。这是在 Qt 4.8.3/MSVC++ 10/Win 7 上。
Z
Zhigalin - Reinstate CMs

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

你可以使用喜欢,

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

这种方式比仅仅为了调试消息而将其转换为 std::string 更好。


qDebug() 会好很多,因为它支持更多的 Qt 类型。
c
chris
QString qstr;
std::string str = qstr.toStdString();

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

QTextStream out(stdout);
out << qstr;

在询问之前,我首先尝试了 << qstr,但它没有编译。不过,它适用于 qstr.toStdString()。
我不这么认为。您尝试了 std::cout << qstr,而不是 QTextString(stdout) << qstr;
P
Puppy

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

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

为什么投反对票,伙计们?就我而言,这有点过头了,但谁知道呢,它可能有用(对我或其他人)。
我喜欢这个,因为 Qt 习惯于改变字符串的工作方式——这将转换放在一个地方。
Z
Zhigalin - Reinstate CMs

建议的替代方案:

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
c
cbuchart

最简单的方法是 QString::toStdString()


H
Hafsa Elif Özçiftci

你可以用这个;

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

请添加一些详细信息,说明错误是什么以及您的答案为何有效
J
JPM
 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();

b
bunbun

尝试这个:

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

问题很明确:将 QString 转换为 std::string,而不是打印它。
@eyllanesc 问题文本说“如何将 qstring 的内容输出到控制台?” ,似乎 OP 假设转换为 std::string 是唯一的方法。真的是同时问了两个问题。
@MM这个问题似乎不清楚,因为标题中的问题是如何将QString转换为std::string?,也许这是一个XY问题。