110

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

您能否详细说明这种方法可能存在的缺陷,或者提供一种替代方法?

4

10 回答 10

128

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

所以也许你还有其他问题。这到底是怎么回事?

于 2010-03-26T14:02:21.277 回答
64

也许

my_qstring.toStdString().c_str();

或者更安全,正如 Federico 指出的那样:

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

它远非最佳,但会完成工作。

于 2010-06-01T23:56:31.257 回答
61

将QString转换为char*的最简单方法是qPrintable(const QString& str),这是一个扩展为str.toLocal8Bit().constData().

于 2016-05-10T08:51:59.597 回答
7

如果您仅将 David 的答案用于输出到文件或在屏幕上显示,那么 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);
于 2010-08-04T17:56:57.593 回答
6

已编辑

这种方式也有效

QString str ("Something");

char* ch = str.toStdString().C_str();
于 2018-05-31T15:32:02.960 回答
3

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

于 2010-03-26T14:37:24.297 回答
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<<"<---";
于 2016-05-29T08:22:48.590 回答
2

如果您的字符串包含非 ASCII 字符 - 最好这样做:( s.toUtf8().data()s->toUtf8().data()

于 2018-12-11T16:17:50.810 回答
2

Qt 提供了最简单的 API

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

如果您想要非常量数据指针,请使用

str.toLocal8Bit().data()
str.toUtf8().data()
于 2020-07-01T13:26:29.893 回答
0

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

QString dataSrc("FooBar");
QString databa = dataSrc.toUtf8();
std::vector<char> data(databa.begin(), databa.end());
char* pDataChar = data.data();
于 2020-07-01T13:17:30.740 回答