我使用 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 。
答案 0 :(得分:2)
此运算符(QString :: toStdString())仅在Qt配置为启用STL兼容性时可用。
所以我猜在 VS2005 和 VS2010 之间存在一些配置问题。
作为旁注:
您不应该使用c_str()
返回的指针并使用它。如果QString
已更改或超出范围,则std::string
返回QString::toStdString()
,指针无效 。如果您通过复制它在其他地方使用该指针,您将具有未定义的行为。最好从std::string
属性创建QString
/ text()
对象,然后再使用它。
答案 1 :(得分:2)
这是错的!这只适用于运气中的一种情况。
此处涉及临时对象。在链lineEdit->text().toStdString().c_str()
中,您有临时对象:QString
,std::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