我想将使用模板方法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()
进行转化检查的一些提示?
答案 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