是否可以将自己的代码注入QVariant :: canConvert?
我添加支持在我们自己的通用值容器和Qt版本(QVariant)之间进行转换,主要基于此处的建议How to support comparisons for QVariant objects containing a custom type?
我非常确定这个问题的答案是"它无法完成",浏览源代码显示QVariant :: canConvert的实现不会调用处理程序,但我想我不会因为病态的好奇而问。
在QVariant实现中是否存在任何随机位置,我们可以在这种功能中获得某种钩子(无需重新编译Qt),如果没有,Handler上的函数是否用于任何事物/为什么它存在?主要是 - 有任何解决这个问题的建议吗?
答案 0 :(得分:2)
当然,您可以将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>();
};
没有&#34;处理程序&#34;因为这都是模板化的。请注意 - 虽然您可以专门化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