使用std::string和QString的互换

9
我在一个软件系统中广泛使用Qt来处理图形和GUI组件。但是,对于大多数内部算法和数据处理,Qt的作用较小。
我经常遇到需要将std::string转换为QString或反之亦然的情况。我的想法是尽可能多地使用std::string,并仅在需要传递字符串到像处理文件系统的Qt类时使用QString。
今天早上我在编程时意识到,在我的代码中同时存在std::string和QString可能是不良设计。我应该完全切换到QString吗?还有其他人遇到过这种设计选择吗?
Qt提供了许多与STL相同的功能,但我仍然犹豫不决是否完全切换,因为Qt不太标准化和稳定。
2个回答

9

是的,我以前遇到过这种情况。我所工作的程序始终使用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的库时,您将不得不付出努力,并且您的非GUI组件不依赖于Qt(万岁!)。

2
QString有一个名为toStdString()的方法。请查看此处:http://doc.trolltech.com/4.5/qstring.html#toStdString。如果要从`std::string`创建`QString`,可以使用此构造函数:http://doc.trolltech.com/4.5/qstring.html#QString-7。 - yasouser
1
@yasourer:是的,但这些函数依赖于全局设置的字符编码。这些函数来自一个库,该库从另一个库中获取了std::string,其中始终包含UTF-8。 - Fred Foo
1
你可以改进这些函数,使它们即使字符串包含嵌入的NULs也能正常工作,方法是同时传递长度 - return QString::fromUtf8(s.c_str(), s.size())auto buf = s.toUtf8(); return std::string(buf.data(), buf.size());. - Toby Speight

6

我建议在程序核心中使用std::string,并在处理GUI部分时将其转换为QString。如果你想要更改GUI工具包,这将更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接