不一致的 QVariant 转换为 double

huangapple go评论113阅读模式
英文:

Inconsistent conversion of QVariant to double

问题

我有困难理解 QVariant::canConvertQVariant::toDouble 的行为。我本来期望,如果底层的变体数据是 QString,那么这两者都应该返回 false,但我得到了不同的结果,如下所示:

  1. #include <QString>
  2. #include <QVariant>
  3. #include <QDebug>
  4. int main(int argc, char *argv[])
  5. {
  6. QString not_a_number("foo");
  7. QVariant variant(not_a_number);
  8. auto can_convert_1 = variant.canConvert<double>();
  9. auto can_convert_2 = false;
  10. variant.toDouble(&can_convert_2);
  11. qDebug() << can_convert_1 << can_convert_2; //打印: true false
  12. }

方法 canConvert 返回 true,而 toDouble 返回 false。
请有人解释一下这个行为吗?

我在 Windows 上使用 Qt 5.15.7 和 Visual Studio 2019。

英文:

I'm having trouble understanding the behaviour of QVariant::canConvert and QVariant::toDouble. I'd expect that both of these would return false if the underlying variant data is, say, a QString, but I'm getting different results as shown:

  1. #include &lt;QString&gt;
  2. #include &lt;QVariant&gt;
  3. #include &lt;QDebug&gt;
  4. int main(int argc, char *argv[])
  5. {
  6. QString not_a_number(&quot;foo&quot;);
  7. QVariant variant(not_a_number);
  8. auto can_convert_1 = variant.canConvert&lt;double&gt;();
  9. auto can_convert_2 = false;
  10. variant.toDouble(&amp;can_convert_2);
  11. qDebug() &lt;&lt; can_convert_1 &lt;&lt; can_convert_2; //prints: true false
  12. }

The method canConvert returns true whereas the toDouble return false.
Can someone explain this behaviour please?

I'm using Qt 5.15.7 on Windows with Visual Studio 2019.

答案1

得分: 1

QVariant::toDouble(bool *ok = nullptr) consttemplate &lt;typename T&gt; bool QVariant::canConvert() const 有两个非常不同的含义。bool* ok 会在转换成功时返回 true,而 canConvert() 则表示源类型是否能够转换为目标类型。

QString 能够转换为 double 吗?可能

QString 是可以转换为 double 的类型之一吗?是的,所以 canConvert() 将始终返回 true,但当然 toDouble() 会失败。

事实上,如果你尝试以下代码:

  1. auto convert = [](auto&& string){
  2. QString not_a_number(string);
  3. QVariant variant(not_a_number);
  4. auto can_convert_1 = variant.canConvert<double>();
  5. auto can_convert_2 = false;
  6. variant.toDouble(&can_convert_2);
  7. qDebug() << can_convert_1 << can_convert_2;
  8. };
  9. convert("foo");
  10. convert("5");

将打印出:

  1. true false
  2. true true

两者都是 QString,所以 canConvert 成功,而 toDouble 只有对 "5" 才能成功转换为 double。

英文:
  1. double QVariant::toDouble(bool *ok = nullptr) const

and

  1. template &lt;typename T&gt; bool QVariant::canConvert() const

have two very different meanings. bool* ok will return true if the conversion has actually succeded, while canConvert() tell if the source type could be converted to the destination type.

QString can be converted to double? Maybe.

QString is one of the type allowed to be converted to double? Yes, so canConvert() will always return true, but toDouble() of course will fail.

Indeed if you try

  1. auto convert = [](auto&amp;&amp; string){
  2. QString not_a_number(string);
  3. QVariant variant(not_a_number);
  4. auto can_convert_1 = variant.canConvert&lt;double&gt;();
  5. auto can_convert_2 = false;
  6. variant.toDouble(&amp;can_convert_2);
  7. qDebug() &lt;&lt; can_convert_1 &lt;&lt; can_convert_2;
  8. };
  9. convert(&quot;foo&quot;);
  10. convert(&quot;5&quot;);

will print

  1. true false
  2. true true

Both are QString, so canConvert succed, toDouble only succed for "5" can actually be converted to double.

huangapple
  • 本文由 发表于 2023年2月23日 23:35:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/75547004.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定