QString to char*转换

maw*_*wia 83 c++ qstring qt qtcore

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

你能用这种方法详细说明可能的缺陷,还是提供另一种方法?

Eli*_*sky 109

好吧,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();
}
Run Code Online (Sandbox Code Playgroud)

所以也许你还有其他问题.究竟这不起作用?

  • `const char*`和`char*`不是同一类型. (10认同)
  • @LightnessRacesinOrbit:有时最好的答案是解开问题.换句话说,要指出它不是在问正确的事情.问题海报接受了这个答案,所以我认为它达到了目标 (4认同)
  • @LightnessRacesinOrbit:写入QString的内容而不知道是一个可怕的想法,因此当然`const char*`是真正可以获得的.用户可以自由地将数据复制到可写缓冲区. (3认同)
  • 我完全同意。但是,问题询问的是“char*”,而不是“char const*”,而您的答案只是忽略了这一事实而不提及。 (2认同)
  • 似乎FAQ已更新为使用`toLocal8Bit()`吗? (2认同)
  • 这可以缩写为 `QString str = "Test"; const char *c_str = str.toLocal8Bit().data();`。 (2认同)

dav*_*dnr 45

也许

my_qstring.toStdString().c_str();

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

std::string str = my_qstring.toStdString();
const char* p = str.c_str();
Run Code Online (Sandbox Code Playgroud)

它远非最佳,但将完成工作.

  • 这个方法非常危险,不应该使用:`toStdString()`返回一个新的`std :: string`对象,然后获得指向内部数据`const char*`的指针.但是,在此语句之后会立即销毁字符串对象,因此如果在后续语句中使用它,结果指针可能没有有效地址. (18认同)
  • 这会弄乱Unicode字符.一个支持Unicode的解决方案:http://stackoverflow.com/a/4644922/238387 (3认同)
  • 具体来说,C++ 临时变量通常会一直存在到创建它们的语句结束为止。因此,如果答案中的第一种形式在函数调用中内联使用(假设该函数不存储指针以供将来使用),则可以,但如果将其分配给变量,则不行。 (2认同)

小智 37

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

  • @Phlucious,因为:1)qPrintable返回的是const char *而不是char *,str.toLocal8Bit()。data()返回的是char *。2)一旦在使用qPrintable的语句中打了分号,指向const char *的指针就会失效。所以`const char * c_ptr = s.toLocal8Bit()。constData();`没有任何意义。 (3认同)

Ale*_*lex 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);
Run Code Online (Sandbox Code Playgroud)


Sha*_*nks 6

已编辑

这种方式也有效

QString str ("Something");

char* ch = str.toStdString().C_str();
Run Code Online (Sandbox Code Playgroud)


小智 6

Qt提供最简单的API

const char *qPrintable(const QString &str)
const char *qUtf8Printable(const QString &str)
Run Code Online (Sandbox Code Playgroud)

如果你想要非常量数据指针使用

str.toLocal8Bit().data()
str.toUtf8().data()
Run Code Online (Sandbox Code Playgroud)