2011-03-31 48 views

回答

44

here at How can I convert a QString to char* and vice versa?

为了为QString转换为 的char *,那么你首先需要通过 得到字符串的 的latin1表示它调用toLatin1(),这将 返回QByteArray中。然后调用QByteArray上的数据() 来获取指向 存储在字节数组中的数据。见 文档:

http://qt.nokia.com/doc/qstring.html#toLatin1 http://qt.nokia.com/doc/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(); 
} 

注意,有必要存储 的bytearray你 呼叫数据()之前它,像下面的电话

const char *c_str2 = str2.toLatin1().data(); 

将使应用程序崩溃的 的QByteArray没有被储存和 因此不再存在

为char *转换为你 可以使用QString的构造函数 需要QLatin1String,如QString的:

QString string = QString(QLatin1String(c_str2)) ; 

参见文档:

http://qt.nokia.com/doc/qlatin1string.html

当然,我发现有从这个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(); 
+8

我认为措辞需要改变。声明'const char * c_str2 = str2.toLatin1()。data();'应该可以正常工作。不幸的是,';'由toLatin1()创建的临时QByteArray已被销毁,因此'c_str2'现在有一个无效指针。相反,你可以在调用'doStuff(str2.toLatin1()。data());'中使用它,因为QByteArray不会被销毁,直到';'因此:'printf(“str2:%s”,str2.toLatin1()。data());'应该可以。 – 2011-03-31 20:46:21

+0

@Martin:我只是引用Qt。 – 2011-03-31 20:49:01

+1

这个。今天我花了一半时间调试QByteArray被破坏引起的问题。必须存储字节数组真的很痛苦,但似乎是必要的。 – misha 2011-11-14 11:24:08

1

你可以使用QFile而不是的std :: fstream的。

QFile   file(qString); 

替代地,QString的转换成一个char *如下:

std::ifstream file(qString.toLatin1().data()); 

QString是UTF-16,从而它被转换toLatin1()在这里,但QString的有几个不同的转换,包括toUtf8的()(检查你的文件系统可能使用UTF-8)。

正如上面的@ 0A0D所指出的那样:不要将char *存储在变量中,而不会获取QByteArray的本地副本。

char const*  fileName = qString.toLatin1().data(); 
std::ifstream file(fileName); // fileName not valid here. 

这是因为toLatin1()返回一个QByteArray对象。由于它实际上并未绑定到变量,因此它是在表达式末尾销毁的临时变量。因此,这里对data()的调用返回一个指向内部结构的指针,该内部结构在';'之后不再存在。