我有一个函数(在STL中为fopen),它将char *参数作为我计算机中的路径,但我必须在那个地方使用QString,因此它不起作用。
如何将QString转换为char *以解决此问题?
答案 0 :(得分:48)
请参阅here at How can I convert a QString to char* and vice versa?
为了将QString转换为 char *,那么你首先需要得到一个 latin1表示字符串的 在它上面调用toLatin1() 返回一个QByteArray。然后调用data() 在QByteArray上获取指针 存储在字节数组中的数据。看到 文档:
https://doc.qt.io/qt-5/qstring.html#toLatin1 https://doc.qt.io/qt-5/qbytearray.html#data
请参阅以下示例 示范:
int main(int argc, char **argv) { QApplication app(argc, argv); QString str1 = "Test"; QByteArray ba = str1.toLatin1(); const char *c_str2 = ba.data(); printf("str2: %s", c_str2); return app.exec(); }
请注意,有必要存储 在调用data()之前的bytearray 它,如下所示的呼叫
const char *c_str2 = str2.toLatin1().data();
会使应用程序崩溃 QByteArray尚未存储和 因此不再存在
将char *转换为QString你 可以使用QString构造函数 采用QLatin1String,例如:
QString string = QString(QLatin1String(c_str2)) ;
参见文档:
当然,我发现还有另外一种方法previous SO answer:
QString qs;
// Either this if you use UTF-8 anywhere
std::string utf8_text = qs.toUtf8().constData();
// or this if you on Windows :-)
std::string current_locale_text = qs.toLocal8Bit().constData();
答案 1 :(得分:1)
您可以使用QFile而不是std :: fstream。
QFile file(qString);
或者将QString转换为char *,如下所示:
std::ifstream file(qString.toLatin1().data());
QString是UTF-16所以它在这里被转换为Latin1()但是QString有几个不同的转换,包括toUtf8()(检查你的文件系统它可能使用UTF-8)。
正如上面的@ 0A0D所述:不将char *存储在变量中,而不会获得QByteArray的本地副本。
char const* fileName = qString.toLatin1().data();
std::ifstream file(fileName); // fileName not valid here.
这是因为toLatin1()返回QByteArray的对象。由于它实际上并未绑定到变量,因此它是在表达式结尾处被销毁的临时变量。因此,对data()的调用返回一个指向内部结构的指针,该结构在';'之后不再存在。