我试图通过以下方法将QString转换为char *类型,但它们似乎不起作用。
//QLineEdit *line=new QLineEdit();{just to describe what is line here}
QString temp=line->text();
char *str=(char *)malloc(10);
QByteArray ba=temp.toLatin1();
strcpy(str,ba.data());
您能用这种方法详细说明可能的缺陷,还是提供另一种方法?
答案 0 :(得分:108)
嗯,Qt FAQ说:
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QString str1 = "Test";
QByteArray ba = str1.toLocal8Bit();
const char *c_str2 = ba.data();
printf("str2: %s", c_str2);
return app.exec();
}
所以也许你还有其他问题。究竟这不起作用?
答案 1 :(得分:42)
也许
my_qstring.toStdString().c_str();
std::string str = my_qstring.toStdString();
const char* p = str.c_str();
这远非最佳,但会完成工作。
答案 2 :(得分:35)
将QString转换为字符* 的最简单方法是qPrintable(const QString& str),
这是一个扩展到str.toLocal8Bit().constData()
的宏。
答案 3 :(得分:6)
如果您只是将它用于输出到文件或在屏幕上显示,David的答案可以正常工作,但如果函数或库需要char *进行解析,那么此方法效果最佳:
// copy QString to char*
QString filename = "C:\dev\file.xml";
char* cstr;
string fname = filename.toStdString();
cstr = new char [fname.size()+1];
strcpy( cstr, fname.c_str() );
// function that requires a char* parameter
parseXML(cstr);
答案 4 :(得分:3)
<强> EDITED 强>
这种方式也有效
QString str ("Something");
char* ch = str.toStdString().C_str();
答案 5 :(得分:2)
您的字符串可能包含非Latin1字符,这会导致未定义的数据。这取决于你的意思“它看起来似乎没有用。”
答案 6 :(得分:2)
正确的解决方案就像这样
QString k;
k = "CRAZYYYQT";
char ab[16];
sprintf(ab,"%s",(const char *)((QByteArray)(k.toLatin1()).data()) );
sprintf(ab,"%s",(const char *)((QByteArray)(k.toStdString()).data()));
sprintf(ab,"%s",(const char *)k.toStdString().c_str() );
qDebug()<<"--->"<<ab<<"<---";
答案 7 :(得分:0)
如果您的字符串包含非ASCII字符-最好这样做:
s.toUtf8().data()
(或s->toUtf8().data()
)
答案 8 :(得分:0)
将std :: vector用作中间容器是一种可行的方法:
QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();
答案 9 :(得分:0)
Qt提供了最简单的API
const char *qPrintable(const QString &str)
const char *qUtf8Printable(const QString &str)
如果要使用非常量数据指针
str.toLocal8Bit().data()
str.toUtf8().data()