【问题标题】:Inconsistent conversion of QVariant to doubleQVariant 到 double 的转换不一致
【发布时间】:2023-02-24 00:25:50
【问题描述】:

我无法理解 QVariant::canConvertQVariant::toDouble 的行为。我希望如果底层变体数据是 QString,那么这两个都会返回 false,但我得到的结果不同,如下所示:

#include <QString>
#include <QVariant>
#include <QDebug>

int main(int argc, char *argv[])
{

    QString not_a_number("foo");
    QVariant variant(not_a_number);

    auto can_convert_1 = variant.canConvert<double>();
    auto can_convert_2 = false;
    variant.toDouble(&can_convert_2);

    qDebug() << can_convert_1 << can_convert_2; //prints: true false
}

canConvert 方法返回 true 而 toDouble 返回 false。 有人可以解释这种行为吗?

我在带有 Visual Studio 2019 的 Windows 上使用 Qt 5.15.7。

【问题讨论】:

    标签: c++ qt qvariant


    【解决方案1】:
    double QVariant::toDouble(bool *ok = nullptr) const
    

    template <typename T> bool QVariant::canConvert() const
    

    有两种截然不同的含义。 bool* ok如果转换会返回true实际上已经成功了, 而 canConvert() 判断源类型可以转换为目标类型。

    QString可以转换成double吗?或许.

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

    确实,如果您尝试

    auto convert = [](auto&& string){
       QString not_a_number(string);
       QVariant variant(not_a_number);
    
       auto can_convert_1 = variant.canConvert<double>();
       auto can_convert_2 = false;
       variant.toDouble(&can_convert_2);
    
       qDebug() << can_convert_1 << can_convert_2;
    };
    
    convert("foo");
    convert("5");
    

    将打印

    true false
    true true
    

    都是String,所以canConvert成功,toDouble只有"5"才成功,其实可以转换成double。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-20
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多