【发布时间】:2010-12-21 07:32:52
【问题描述】:
最基本的方法是什么?
【问题讨论】:
最基本的方法是什么?
【问题讨论】:
如果你的字符串是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);
如果你有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);
【讨论】:
std::string s = "Sambuca";
QString q = s.c_str();
警告:如果std::string 包含\0s,这将不起作用。
【讨论】:
您是指 C 字符串,如 char* 字符串,还是 C++ std::string 对象?
无论哪种方式,您都使用相同的构造函数,如 QT 参考中所述:
对于常规的 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 构造函数。
如果与 STL 兼容编译,QString 有一个 static method 将 std::string 转换为 QString:
std::string str = "abc";
QString qstr = QString::fromStdString(str);
【讨论】:
QString qstr = QString(str.c_str());吗?不确定QString 是否复制了传入的内容。
fromStdString 将保留这些,从 .c_str 构造不会。 (正是如何做到这一点让我想到了这个问题。)
另一种方式:
std::string s = "This is an STL string";
QString qs = QString::fromAscii(s.data(), s.size());
这样做的好处是不使用.c_str(),这可能会导致std::string自我复制,以防最后没有地方添加'\0'。
【讨论】:
.c_str() 的隐藏副本)
我遇到这个问题是因为我在遵循答案时遇到问题,所以我在这里发布我的解决方案。
以上示例都显示了字符串仅包含 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
【讨论】: