替换QVariant :: Handler :: canConvert

时间:2015-12-31 17:11:08

标签: c++ qt qvariant

是否可以将自己的代码注入QVariant :: canConvert?

我添加支持在我们自己的通用值容器和Qt版本(QVariant)之间进行转换,主要基于此处的建议How to support comparisons for QVariant objects containing a custom type?

我非常确定这个问题的答案是"它无法完成",浏览源代码显示QVariant :: canConvert的实现不会调用处理程序,但我想我不会因为病态的好奇而问。

https://github.com/qtproject/qt/blob/b05d05fd9ce2aeedfaf805a7ed9007a93c902bc9/src/corelib/kernel/qvariant.cpp#L2719

在QVariant实现中是否存在任何随机位置,我们可以在这种功能中获得某种钩子(无需重新编译Qt),如果没有,Handler上的函数是否用于任何事物/为什么它存在?主要是 - 有任何解决这个问题的建议吗?

1 个答案:

答案 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