【问题标题】:Difference between Qt Strings FunctionsQt 字符串函数之间的区别
【发布时间】:2014-05-27 07:32:18
【问题描述】:

我使用 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-&gt;text().toStdString().c_str(); 在 VS2005 上运行良好,而在 VS2010 上却不能。

【问题讨论】:

  • 在 Qt 领域,使用 Qt 类和函数。如果您不编写外部接口,我真的会避免更改为标准 C++ 类,即使这样我也更愿意坚持 Qt 方面。
  • 实际上我正在编写一个外部接口...我在 mongoDB 中使用这个 lineEdit 值..它与 const char* 一起使用。
  • 它期望什么编码? QString 是 Unicode,所以这很重要。

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


【解决方案1】:

来自Qt documentation

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

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

附注:

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

【讨论】:

  • 其实我认为c_str只有在stdstring有效的情况下才有效,所以一旦它被销毁(在分号处)c_str就不再有效
  • @ratchetfreak,是的。在分号之后,QString 超出范围,char* 也是如此。我想我提到过。
  • @RakibulHasan 你指出的是一个真正的缺陷。因此,我们的应用程序产生了垃圾日志。 lineEdit-&gt;text().toLatin1().data() 也是如此。
【解决方案2】:

错了!这在一种情况下只能靠运气。

这里涉及到临时对象。在lineEdit-&gt;text().toStdString().c_str() 链中,您有临时对象:QString、std::string。
现在最后一个临时对象给你指向 c-string 的指针,这个对象是这个 c-string 的 owner。在下一行临时对象被销毁并且您的 c-string 也被释放之前。

它在 VS2005 中运行纯属运气。代码不正确。

只有在单行中使用 value 时,此链才有效。所以这行是正确的:

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 一样长

【讨论】:

  • 在示例的第二行中,传递的指针仅在函数内部有效,如果它存储它以供以后访问,您将获得未定义的行为。
  • 这在我解释问题时很明显。
  • 尊敬的先生,我已经在问题中提到,即使std::cout 也不能像这样工作..std::cout&lt;&lt;lineEdit-&gt;text().toStdString(); 。我已经尝试过你的方法,但得到了一些垃圾价值。
  • 关于qDebug(),它之所以有效,是因为它直接打印QString值而没有任何转换为​​std::string和c_str。
  • 我建议改进问题而不是包含 std::cout 的代码。请记住包含QString 的确切内容以及您在控制台上获得的内容。我怀疑你有有趣的角色在转换过程中会丢失(可能你会得到一堆问号或正方形)。这可能是文本编解码器相关问题。
猜你喜欢
  • 2017-01-29
  • 2013-05-26
  • 1970-01-01
  • 2013-07-28
  • 2018-07-20
  • 2014-06-17
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多