无法检查带有 value() 的 QVariant 转换

QVariant conversion with value() can't be checked

我想使用模板方法 value() 将存储字符串的 QVariant 转换为值。同样的事情可以用其他方法来完成,比如 toInt()toDouble() 等等。

我现在的问题是,例如使用 toDouble(bool *ok = Q_NULLPTR) 我可以将一个指向 bool 的指针作为参数传递,以检查转换是否顺利进行。但我无法使用 value() 执行此检查。这里有一个小例子来重现它。

#include <QVariant>
#include <QDebug>

int main()
{
   QVariant v;
   QString str = "300.0"; //Valid number
   v.setValue(str);

   QVariant v2;
   QString str2 = "3kk.4f"; //Invalid number
   v2.setValue(str2);

   if( v.canConvert<double>() ) {
      qDebug() << "Ok QString to double is permitted";
      qDebug() << "Result: " << v.value<double>();
   }

   if( v2.canConvert<double>() ) {
      qDebug() << "Yes QString to double is already permitted";
      qDebug() << "Result: " << v2.value<double>();
      //Oh oh result is 0.0 but is string invalid or it really contain value 0 ?
   }

   return 0;
}

有关如何使用模板方法进行此转换检查的一些提示value()?

你可以使用QVariant::convert(int)传递目标类型的元类型id,你可以通过qMetaTypeId<T>()获得。例如

QVariant valid("123.4");
QVariant invalid("123x.y4");

qDebug() << "Types:";
qDebug() << valid.typeName(); // "QString"
qDebug() << invalid.typeName(); // "QString"

// there is a registered QString->double conversion,
// so these will return true
qDebug() << "Can convert:";
qDebug() << valid.canConvert<double>(); // true
qDebug() << invalid.canConvert<double>(); // true

qDebug() << "Convert valid:";
if (!valid.convert(qMetaTypeId<double>()))
    qDebug() << "Conversion failed"; // gets NOT printed

qDebug() << valid.typeName(); // "double"
qDebug() << valid.isNull(); // false
qDebug() << valid.value<double>(); // 123.4

qDebug() << "Convert invalid:";
if (!invalid.convert(qMetaTypeId<double>()))
    qDebug() << "Conversion failed"; // is printed

qDebug() << invalid.typeName(); // "double"
qDebug() << invalid.isNull(); // true
qDebug() << invalid.value<double>(); // 0