2011-05-26 50 views
9

我在为图形和GUI组件工作的软件系统中广泛使用Qt。但是,对于大多数内部算法和数据处理而言,Qt起着较小的作用。可互换地使用std :: string和QString

我经常会遇到需要将std :: string转换为QString或反之亦然。我倾向于尽可能多地使用std :: string,并且在需要将字符串传递给类似于文件系统的Qt类时使用QString 只有

正如我今天上午编程时,它打击了我可能是糟糕的设计,让std :: string和QString都散布在我的代码中。我应该完全切换到QString?有没有其他人遇到这种设计选择?

Qt提供了很多与STL相同的功能,但由于Qt不够标准化和稳定,所以我仍然犹豫不决。

回答

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(hurray!)。

+1

'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 2011-06-01 18:37:57

+1

@yasourer:是的,但那些依赖于全局设置字符编码。这些函数来自一个库,它从另一个库中获得'std :: string',它总是包含UTF-8。 – 2011-06-01 20:18:17

+0

通过传递长度以及返回QString :: fromUtf8(s.c_str(),s.size())和auto buf = s,即使字符串包含嵌入的NUL,也可以改进这些函数的工作。 toUtf8();返回std :: string(buf.data(),buf.size());'。 – 2017-08-24 08:28:54

6

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