【问题标题】:How to convert QString to std::string?如何将 QString 转换为 std::string?
【发布时间】:2011-05-11 23:48:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ qt type-conversion qstring


    【解决方案1】:

    你可以使用:

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

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

    【讨论】:

    • 从 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 字符(例如,来自英语以外的语言)可以吗?
    【解决方案2】:

    试试这个:

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

    【讨论】:

    • 问题很明确:将QString转换为std::string,而不是打印出来。
    • @eyllanesc 问题文本说“如何将 qstring 的内容输出到控制台?” ,似乎 OP 假设转换为 std::string 是唯一的方法。真的是同时问了两个问题。
    • @M.M 这个问题似乎不清楚,因为标题中的问题是 How to convert QString to std::string?,也许是 XY 问题。
    【解决方案3】:
     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();
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        建议的替代方案:

        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
        【解决方案6】:

        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&amp; 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 &lt;&lt; s.toStdString() &lt;&lt; std::endl; std::cout &lt;&lt; s.toUtf8().constData() &lt;&lt; std::endl;。第一个是错误的,第二个是完美的。你需要一个 utf8 终端来测试它。
        • 对于我来说,.toStdString() 总是会导致管道操作员的访问冲突,无论QString 的内容如何(非拉丁1 与否)。这是在 Qt 4.8.3/MSVC++ 10/Win 7 上。
        【解决方案7】:

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

        你可以用like,

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

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

        【讨论】:

        • qDebug() 会好很多,因为它支持更多的 Qt 类型。
        【解决方案8】:

        你可以用这个;

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

        【讨论】:

        • 请添加一些详细信息,说明错误是什么以及您的答案有效的原因
        【解决方案9】:

        最好的办法是自己重载 operator

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

        【讨论】:

        • 为什么投反对票,伙计们?在我的情况下,这是一个矫枉过正,但谁知道呢,它可能有用(对我或其他人)。
        • 我喜欢这个,因为 Qt 有改变字符串工作方式的习惯 - 这将转换放在一个地方。
        【解决方案10】:
        QString qstr;
        std::string str = qstr.toStdString();
        

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

        QTextStream out(stdout);
        out << qstr;
        

        【讨论】:

        • 我在询问之前先尝试了
        • 我不这么认为。您尝试了 std::cout
        猜你喜欢
        • 2013-08-21
        • 2011-05-19
        • 2011-07-21
        • 2013-05-11
        • 2014-09-08
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 2018-05-18
        相关资源
        最近更新 更多