当然,您可以使用QVariant::canConvert()
自定义数据类型。唯一需要注意的是,您必须使用类型系统注册类型。如果您不这样做,您将通过static_assert
,
错误:静态断言失败:类型未注册,请使用 Q_DECLARE_METATYPE 宏使其为 Qt 的元对象系统所知
例如,这段代码工作得很好,
struct Foo {
int a, b;
};
Q_DECLARE_METATYPE(Foo)
int main()
{
Foo foo {1, 2};
QVariant variant = QVariant::fromValue(foo);
qDebug() << variant.canConvert<Foo>();
}
如果你想覆盖默认模板,你只需要提供你自己的专业化来做你想做的事,
template<>
bool QVariant::canConvert<Foo>() const {
qDebug() << "Hello from my specialization!";
return userType() == qMetaTypeId<Foo>();
};
没有“处理程序”,因为这都是模板化的。请注意 - 虽然您可以专门化 QVariant::value() 之类的模板,但即使您专门化int
大小写,它也不会影响 QVariant::toInt() 和类似内容。例如,
template<>
int QVariant::value<int>() const
{
if (userType() == qMetaTypeId<Foo>()) {
return value<Foo>().a + value<Foo>().b;
};
return toInt();
}
....
qDebug() << variant.value<int>() << variant.toInt();
生产,
3 0