如果编译时与 STL 兼容,则 QString
具有将 std::string
转换为 QString
的 static method:
std::string str = "abc";
QString qstr = QString::fromStdString(str);
如果你的意思是字符串 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);
替代方式:
std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());
这样做的好处是不使用 .c_str()
,这可能会导致 std::string
复制自身,以防最后没有地方添加 '\0'
。
.c_str()
隐藏副本)
std::string s = "Sambuca";
QString q = s.c_str();
警告:如果 std::string
包含 \0
,这将不起作用。
我遇到了这个问题,因为我在遵循答案时遇到了问题,所以我在这里发布了我的解决方案。
上面的示例都显示了字符串仅包含 ASCII 值的示例,在这种情况下一切正常。但是,当在 Windows 中处理还可以包含其他字符(例如德语变音符号)的字符串时,这些解决方案不起作用
在这种情况下,唯一能给出正确结果的代码是
std::string s = "Übernahme";
QString q = QString::fromLocal8Bit(s.c_str());
如果您不必处理此类字符串,则上述答案将正常工作。
fromLocal8Bit()
的调用
此外,要转换任何你想要的,你可以使用 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
您是指 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());
QByteArray::QByteArray (const char* data, int size)
包装缓冲区,然后将其传递给 QString
构造函数。
不定期副业成功案例分享
QString qstr = QString(str.c_str());
吗?不确定QString
是否复制了传入的内容。fromStdString
将保留这些,从.c_str
构建不会。 (正是如何做到这一点让我想到了这个问题。)