QString 到 char * 的转换

我试图通过以下方法将 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());

你能否详细说明这种方法可能存在的缺陷,或者给出一种替代方法?

241314 次浏览

常见问题表示:

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();
}

也许你还有其他问题,这怎么会不管用呢?

您的字符串可能包含非 Latin1字符,这将导致未定义的数据。这取决于你所说的“似乎不起作用”是什么意思。

也许吧

my_qstring.toStdString().c_str();

或者更安全,正如费德里科所指出的:

std::string str = my_qstring.toStdString();
const char* p = str.c_str();

虽然不是最佳选择,但还是可行的。

David's answer works fine if you're only using it for outputting to a file or displaying on the screen, but if a function or library requires a char* for parsing, then this method works best:

// 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);

QString转换为 Char * 最简单的方法是 QPrintable (const QString & str), 这是一个宏观扩展到 str.toLocal8Bit().constData()

正确的解决方案是这样的

   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<<"<---";

编辑

这样也行

QString str ("Something");


char* ch = str.toStdString().C_str();

If your string contains non-ASCII characters - it's better to do it this way: s.toUtf8().data()(或 s->toUtf8().data())

使用 std: : Vector 作为中间容器是一种可行的方法:

QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();

Qt 提供了最简单的 API

const char *qPrintable(const QString &str)
const char *qUtf8Printable(const QString &str)

如果希望使用非常数数据指针,请使用

str.toLocal8Bit().data()
str.toUtf8().data()