Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将字符串更改为QString?_C++_String_Qt_Qstring - Fatal编程技术网

C++ 如何将字符串更改为QString?

C++ 如何将字符串更改为QString?,c++,string,qt,qstring,C++,String,Qt,Qstring,最基本的方法是什么?如果您所说的字符串是指std::string您可以使用以下方法: 如果字符串是指Ascii编码的const char*,则可以使用以下方法: 如果您的const char*编码为可读取的系统编码,则应使用以下方法: 如果有UTF8编码的const char*,则需要使用此方法: 还有一种方法用于const ushort*包含UTF16编码字符串: < > >强>警告:< >:如果代码>字符串> 包含 0代码> S.< /P> < P>,你是指C字符串,如在

最基本的方法是什么?

如果您所说的字符串是指
std::string
您可以使用以下方法:


如果字符串是指Ascii编码的
const char*
,则可以使用以下方法:


如果您的
const char*
编码为可读取的系统编码,则应使用以下方法:


如果有UTF8编码的
const char*
,则需要使用此方法:


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


< > >强>警告:< <强> >:如果<>代码>字符串> <代码>包含<代码> 0代码> S.< /P> < P>,你是指C字符串,如在<代码> char */COD>字符串中,还是C++ <代码> STD::String < /Cord>对象?< /P> 无论哪种方式,您都使用相同的构造函数,如QT参考中所述:

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

char name[] = "Stack Overflow";
QString qname(name);
std::string name2("Stack Overflow");
QString qname2(name2.c_str());
对于
std::string
,您将
char*
获取到缓冲区,并将其传递给
QString
构造函数:

char name[] = "Stack Overflow";
QString qname(name);
std::string name2("Stack Overflow");
QString qname2(name2.c_str());

如果使用STL兼容性编译,
QString
具有将
std::string
转换为
QString
的功能:

std::string str = "abc";
QString qstr = QString::fromStdString(str);
替代方法:

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

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

我遇到这个问题,因为我在遵循答案时遇到了问题,所以我在这里发布了我的解决方案

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

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

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

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

此外,要转换任何您想要的内容,您可以使用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();

你不想用'new'来构造QString.@Rohan-谢谢你的评论。我将从我的答案中删除这一点。它没有回答问题。我从未见过如此多的反对票被接受的答案。为什么作者不把它编辑成比投票率最高的答案更好的答案呢?喜欢添加更多细节吗?在那之前,再享受一个-1。看起来它现在已经修好了,而且相当不错,所以我给出了这个和另一个+1。虽然OP没有提到嵌入的空值,但这是真的。如果需要,您可以使用
QByteArray::QByteArray(const char*data,int size)
首先包装缓冲区,然后将其传递给
QString
构造函数。感谢关于.c_str()的潜在隐藏副本的提示。对于c++11,这不再是c++11之前的问题(使用
.c_str()
的隐藏副本),潜在的隐藏拷贝纯粹是理论上的可能性——实际上没有任何实现能够做到这一点。在我看来,这实际上应该避免。如果编译标准库QT时使用的版本与编译时使用的版本有所不同,则会出现问题。In在QT和libstdc++之间创建了一个不必要的依赖关系,该依赖关系在QT中不存在。@shoosh:为了避免这种情况,不能只执行
QString qstr=QString(str.c_str())?不确定
QString
是否复制传入它的内容。@shoosh:我理解您对兼容性的担忧,但QString和std::string都可以包含空字符<代码>从stdstring
将保留这些,从
构建。c_str
不会。(正是如何做到这一点让我想到了这个问题。)@MartinBonner QByteArray有一个以const char*和length为参数的向量。QString有一个接受QbyteArray的ctor,它不依赖于std::string,而是依赖于源文件的字符串文本编码。如果源文件是UTF8,它将工作,但会中断对local8bit()的
调用。
std::string str = "abc";
QString qstr = QString::fromStdString(str);
std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());
std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());
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