ChatGPT解决这个技术问题 Extra ChatGPT

如何将字符串更改为 QString?

最基本的方法是什么?


s
sth

如果编译时与 STL 兼容,则 QString 具有将 std::string 转换为 QStringstatic method

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

在我看来,这实际上应该避免。如果编译 QT 的标准库版本与您正在编译的版本有所不同,那么您将遇到麻烦。 In 在 QT 和 libstdc++ 之间创建了一个不必要的依赖关系,这种依赖关系在 QT 的其他任何地方都不存在。
@shoosh:为了避免这种情况,不能只做QString qstr = QString(str.c_str());吗?不确定 QString 是否复制了传入的内容。
@shoosh:我理解您对兼容性的担忧,但 QString 和 std::string 都可以包含空字符。 fromStdString 将保留这些,从 .c_str 构建不会。 (正是如何做到这一点让我想到了这个问题。)
@MartinBonner QByteArray 有一个接受 const char* 和长度的ctor。 QString 有一个接受 QByteArray 的 ctor
K
Kamil Szot

如果你的意思是字符串 std::string 你可以用这个方法来做到这一点:

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

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

如果通过字符串你的意思是 Ascii 编码 const char * 那么你可以使用这个方法:

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

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

如果您使用可以使用 QTextCodec::codecForLocale() 读取的系统编码对 const char * 进行了编码,那么您应该使用以下方法:

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);

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

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);

作为一个快速点,Ascii 现在在 QT5 中已过时......
s
shoosh

替代方式:

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

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


使用 c++11,这不再是问题(使用 .c_str() 隐藏副本)
在 C++11 之前,潜在的隐藏副本纯粹是理论上的可能性——实际上没有实现。
C
Claudiu
std::string s = "Sambuca";
QString q = s.c_str();

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


D
Devolus

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

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

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

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

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


这不取决于 std::string 而是取决于源文件与字符串文字的编码。如果您的源文件是 UTF8,它可以工作,但会中断您对 fromLocal8Bit() 的调用
G
Gabriel de Grimouard

此外,要转换任何你想要的,你可以使用 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

T
Tarod

您是指 C 字符串(如 char* 字符串)还是 C++ std::string 对象?

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

Qt QString 参考

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

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

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

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

确实如此,尽管 OP 没有提到嵌入式 NULL。如果需要,您可以先使用 QByteArray::QByteArray (const char* data, int size) 包装缓冲区,然后将其传递给 QString 构造函数。