如何将字符串转换为QString?


Answers:


154

如果按字符串表示std::string您可以使用以下方法进行操作:

QString QString :: fromStdString(const std :: string&str)

std::string str = "Hello world";
QString qstr = QString::fromStdString(str);

如果按字符串表示const char *您使用Ascii编码,则可以使用以下方法:

QString QString :: fromAscii(con​​st char * str,int size = -1)

const char* str = "Hello world";
QString qstr = QString::fromAscii(str);

如果您const char *使用可以通过QTextCodec :: codecForLocale()读取的系统编码进行编码,则应使用以下方法:

QString QString :: fromLocal8Bit(const char * str,int size = -1)

const char* str = "zażółć gęślą jaźń";      // latin2 source file and system encoding
QString qstr = QString::fromLocal8Bit(str);

如果您使用const char *UTF8编码,则需要使用以下方法:

QString QString :: fromUtf8(const char * str,int size = -1)

const char* str = read_raw("hello.txt"); // assuming hello.txt is UTF8 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const char*
QString qstr = QString::fromUtf8(str);

还有一种const ushort *包含UTF16编码的字符串的方法:

QString QString :: fromUtf16(const ushort * unicode,int size = -1)

const ushort* str = read_raw("hello.txt"); // assuming hello.txt is UTF16 encoded, and read_raw() reads bytes from file into memory and returns pointer to the first byte as const ushort*
QString qstr = QString::fromUtf16(str);

1
您不想使用“ new”构造QString。
rohanpm

@Rohan-谢谢您的评论。我正在从我的答案中删除它。
卡米尔·索特

它没有回答问题。
CCoder

1
我从未见过这么多否决票的公认答案。作者为什么不以比最高投票答案更好的方式来编辑它?喜欢添加更多细节吗?在那之前,再享受-1。
托马什Zato -恢复莫妮卡

3
看来它已固定,而且还不错,所以我给了这个和另一个+1。
csl 2015年

242

如果使用STL兼容性进行编译,请QString使用静态方法将转换std::stringQString

std::string str = "abc";
QString qstr = QString::fromStdString(str);

3
我认为实际上应该避免这种情况。如果QT的标准库版本与您所编译的版本有所不同,那么您将遇到麻烦。In在QT和libstdc ++之间创建了不必要的依赖关系,而QT中没有其他依赖关系。
shoosh

@shoosh:为避免这种情况,人们不能这样做QString qstr = QString(str.c_str());吗?不确定是否QString复制传递给它的内容。
克劳迪(Claudiu)2014年

@shoosh:我了解您对兼容性的担忧,但是QString和std :: string都可以包含空字符。 fromStdString将保留这些内容,从.c_str不会进行构建。(而正是通过这种方法使我提出了这个问题。)
Martin Bonner支持Monica

@MartinBonner QByteArray具有一个采用const char *和长度的ctor。QString有一个带QByteArray的ctor
shoosh

13

替代方式:

std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());

这样的好处是,如果没有地方在末尾添加,则不使用.c_str()可能导致std::string自身复制'\0'


2
感谢您提供有关.c_str()潜在隐藏副本的提示。
Trass3r 2013年

使用c ++ 11,这不再是一个问题(带有的隐藏副本.c_str()
Steve Lorimer

1
在C ++ 11之前,潜在的隐藏副本纯粹是理论上的可能性-实际没有实现。
马丁·邦纳

11
std::string s = "Sambuca";
QString q = s.c_str();

警告:如果std::string包含,则此方法无效\0


3

我遇到了这个问题,因为在遵循答案时遇到了问题,因此我在此处发布了解决方案。

上面的示例全部显示了仅包含ASCII值的字符串的示例,在这种情况下,一切正常。但是,当在Windows中处理字符串时,如果还可以包含其他字符(如德语变音符),则这些解决方案将不起作用

在这种情况下,给出正确结果的唯一代码是

std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());

如果您不必处理此类字符串,则以上答案将可以正常工作。


这不依赖于std :: string,而是依赖于带有字符串文字的源文件的编码。如果您的源文件是UTF8,它将起作用,但会中断您的呼叫fromLocal8Bit()
namezero

0

此外,要转换任何内容,可以使用QVariant类。

例如:

std::string str("hello !");
qDebug() << QVariant(str.c_str()).toString();
int test = 10;
double titi = 5.42;
qDebug() << QVariant(test).toString();
qDebug() << QVariant(titi).toString();
qDebug() << QVariant(titi).toInt();

输出

"hello !"
"10"
"5.42"
5

0

您是指字符串中的C字符串char*,还是C ++ std::string对象?

无论哪种方式,您都可以使用QT参考资料中所述的相同构造函数:

对于常规的C字符串,只需使用main构造函数即可:

char name[] = "Stack Overflow";
QString qname(name);

对于a std::string,您将获得到char*缓冲区,并将其传递给QString构造函数:

std::string name2("Stack Overflow");
QString qname2(name2.c_str());

1
确实如此,尽管OP没有提及嵌入式NULL。如果需要,您可以使用QByteArray::QByteArray (const char* data, int size)先包装缓冲区,然后再将其传递给QString构造函数。
gavinb 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.