无法检查带值()的QVariant转换

时间:2017-06-24 17:26:50

标签: c++ qt templates qvariant

我想将使用模板方法QVariant存储字符串的value()转换为值。使用其他方法也可以做同样的事情,例如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()进行转化检查的一些提示?

1 个答案:

答案 0 :(得分:2)

您可以使用QVariant::convert(int)传递目标类型的元类型ID,您可以通过qMetaTypeId<T>()获取该类型ID。 E.g。

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