Qt字符串函数之间的差异

时间:2014-05-27 07:32:19

标签: c++ visual-studio-2010 qt qlineedit

我使用 Qt -4.7.4 版本在 VS2005 上创建了一个项目。在那个项目中,我使用了lineEdit并从lineEdit中获取了这样的文本

const char* test= lineEdit->text().toStdString().c_str();

上面这行完美无缺,但现在我使用VS2010并使用相同的上面一行,但它没有向我显示test变量的任何内容。

qDebug()<<lineEdit->text()<<endl;

以上行正在打印lineEdit的正确值,但是当我使用std::string然后使用cout时。它没有在 VS2010 上显示任何值。所以我用了

const char* test= lineEdit->text().toLatin1().data();

上面的这一行现在正在向我展示 VS2010 上的所有内容。

我不知道为什么const char* test= lineEdit->text().toStdString().c_str(); VS2005 上完美运作,为什么不在 VS2010

2 个答案:

答案 0 :(得分:2)

来自Qt documentation

  

此运算符(QString :: toStdString())仅在Qt配置为启用STL兼容性时可用。

所以我猜在 VS2005 VS2010 之间存在一些配置问题。

作为旁注:

您不应该使用c_str()返回的指针并使用它。如果QString已更改或超出范围,则std::string返回QString::toStdString(),指针无效 。如果您通过复制它在其他地方使用该指针,您将具有未定义的行为。最好从std::string属性创建QString / text()对象,然后再使用它。

答案 1 :(得分:2)

这是错的!这只适用于运气中的一种情况。

此处涉及临时对象。在链lineEdit->text().toStdString().c_str()中,您有临时对象:QStringstd::string 现在,最后一个临时对象为您提供了指向c-string的指针,该对象是此c-string的所有者。在下一行临时对象被销毁之前,你的c-string也被释放。

纯粹的运气在VS2005中起作用了。代码不正确。

此链仅在此单行中使用值时有效。所以这条线是正确的:

qDebug() << lineEdit->text().toStdString().c_str();
someFinction(lineEdit->text().toStdString().c_str());

另一种解决方法:

std::string s = lineEdit->text().toStdString();
qDebug() << s.c_str();
someFunction(s.c_str());

C-string将与std::string

一样长