无法检查带有 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
我想使用模板方法 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