关于c ++:如何将字符串更改为QString?

How to change string into QString?

最基本的方法是什么?


如果使用STL兼容性编译,QString有静态方法将std::string转换为QString

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


如果"字符串"是指std::string,则可以使用此方法:

qstring qstring::fromstdstring(const std::string&str)

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

如果按字符串表示的是ASCII编码的const char *,则可以使用此方法:

qstring qstring::fromascii(const char*str,int size=-1)

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

如果您使用系统编码对const char *进行编码,可以使用qtexcodec::codecforlocale()读取该编码,则应使用以下方法:

qString qString::FromLocal8bit(const char*str,int size=-1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const char* str ="za?ó?? g??l? ja??";      // latin2 source file and system encodin
nQString qstr = QString::fromLocal8Bit(str);<;/code&gt<;/pr>
n<;h>
n<;>;If you have<;cod>;const char <;/cod>; that's UTF8 encoded then you'll need to use this method<;/>
n<;p&gt<;a href""http://doc.qt.io/qt-4.8/qstring.html#fromUtf"" rel""noreferrer>;QString QString::fromUtf8(const char * str, int size = -1<;/a&gt<;/>
n<;pre&gt<;cod>;const char* str = read_raw""hello.tx""); // 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
nQString qstr = QString::fromUtf8(str);<;/code&gt<;/pr>
n<;h>
n<;>;There's also method for<;cod>;const ushort <;/cod>; containing UTF16 encoded string<;/>
n<;p&gt<;a href""http://doc.qt.io/qt-4.8/qstring.html#fromUtf1"" rel""noreferrer>;QString QString::fromUtf16(const ushort * unicode, int size = -1<;/a&gt<;/>
n<;pre&gt<;cod>;const ushort* str = read_raw""hello.tx""); // 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
nQString qstr = QString::fromUtf16(str);<;/code&gt<;/pr>
n
<div class="suo-content">[collapse title=""]<ul><li>您不想用"new"构造qstring。</li><li>@罗汉-谢谢你的评论。我要把这个从我的答案中删除。</li><li>它不能回答这个问题。</li><li>我从未见过如此多的反对票被接受。为什么作者不把它编辑成比最高投票结果更好的答案呢?喜欢添加更多细节吗?在此之前,再享受一次-1。</li><li>似乎现在已经修好了,而且还不错,所以我把这个和另一个+1都给了。</li></ul>[/collapse]</div><p><center>[wp_ad_camp_1]</center></p><hr><P>替代方式:</P>[cc lang="cpp"]std::string s ="This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());

这样做的好处是不使用.c_str(),如果最后没有地方添加'\0',可能会导致std::string复制自己。


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

警告:如果std::string包含\0s,这将不起作用。


我遇到这个问题是因为我在跟踪答案时遇到了问题,所以我将我的解决方案发布在这里。

上面的示例都显示了仅包含ASCII值的字符串示例,在这种情况下,一切正常。但是,在Windows中处理字符串时,whcih也可以包含其他字符,如德语umlauts,则这些解决方案不起作用。

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

1
2
std::string s ="übernahme";
QString q = QString::fromLocal8Bit(s.c_str());

如果你不需要处理这些字符串,那么上面的答案就可以了。


此外,要转换您想要的任何内容,您可以使用qvariant类。

例如:

1
2
3
4
5
6
7
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();

输出

1
2
3
4
"hello !"
"10"
"5.42"
5


你是指一个C字符串,比如在EDCOX1的5个字符串中,还是C++ EDCOX1的0个对象?

无论哪种方式,您都使用相同的构造函数,如qt引用中所述:

  • Qt-Q字符串引用

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

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

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

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