【问题标题】:Using both std::string and QString interchangeably交替使用 std::string 和 QString
【发布时间】:2011-09-02 13:02:35
【问题描述】:

我在我正在为图形和 GUI 组件开发的软件系统中广泛使用 Qt。然而,对于大多数内部算法和数据处理,Qt 所起的作用较小。

我经常会遇到从 std::string 转换为 QString 的需要,反之亦然。我的倾向是尽可能多地使用 std::string 并在需要将字符串传递给 Qt 类(比如那些与文件系统一起使用的类)时使用 QString only

今天早上我在编程时,突然想到在我的代码中同时使用 std::string 和 QString 可能是一个糟糕的设计。我应该完全切换到 QString 吗?有其他人遇到过这种设计选择吗?

Qt 提供了许多与 STL 相同的功能,但我仍然犹豫是否要完全切换,因为 Qt 的标准化和稳定性较低。

【问题讨论】:

    标签: c++ string qt stl qstring


    【解决方案1】:

    是的,我以前也遇到过这种情况。我工作的程序自始至终都使用 Qt,但我不得不将它连接到一个预期为 std::string 的库。 QString 的好处是它明确使用 Unicode,而 C++ 标准库不保证编码。

    解决方案是在这个库的边界处转换

    QString toQString(std::string const &s)
    {
        return QString::fromUtf8(s.c_str());
    }
    
    std::string fromQString(QString const &s)
    {
        return std::string(s.toUtf8().data());
    }
    

    因为库生成了包含 UTF-8 的 std::string

    您似乎想要的恰恰相反:在整个过程中使用 std::string 并在 Qt 边界处进行转换。这似乎完全没问题;它比总是使用QString 需要更多的工作,但是当您需要一个非QString-accepting 库时,您必须付出努力,并且您的非 GUI 组件不依赖于 Qt(欢呼!)。

    【讨论】:

    • QString 有一个方法 toStdString()。见这里:doc.trolltech.com/4.5/qstring.html#toStdString。要从std::string 创建QString,您可以使用此构造函数:doc.trolltech.com/4.5/qstring.html#QString-7
    • @yasourer:是的,但是这些依赖于全局设置的字符编码。这些函数来自一个库,该库从另一个库获取std::string's,始终包含 UTF-8。
    • 即使字符串包含嵌入的 NUL,您也可以通过传递长度来改进这些函数以使其正常工作 - return QString::fromUtf8(s.c_str(), s.size())auto buf = s.toUtf8(); return std::string(buf.data(), buf.size());
    【解决方案2】:

    我会说在您的程序核心中使用std::string,并在您处理GUI 部分时将它们转换为QString。如果你想改变你的 GUI 工具包,那会更容易。

    【讨论】: