替换 QVariant::Handler::canConvert

Posted

技术标签:

【中文标题】替换 QVariant::Handler::canConvert【英文标题】:Replacing QVariant::Handler::canConvert 【发布时间】:2015-12-31 17:11:08 【问题描述】:

是否可以将我们自己的代码注入到 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】:

当然,您可以将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

【讨论】:

谢谢,这很好地回答了我的问题! 这个“有效”,但我假设一次可以专门化,例如 value&lt;int&gt;() 一次,否则在编译期间您会遇到名称冲突,因此需要在一个专门化中添加所有自定义类型?另外,为了清楚起见,我建议添加canConvert template&lt;&gt; bool QVariant::canConvert&lt;int&gt;() const if(userType() == QMetaTypeId&lt;Foo&gt;()) return true; else return canConvert(qMetaTypeId&lt;int&gt;()); 否则它会破坏所有其他canConvert() 调用

以上是关于替换 QVariant::Handler::canConvert的主要内容,如果未能解决你的问题,请参考以下文章

linux 给文件替换字符串/替换内容/替换某行 (shell,sed)

linux系统替换文件怎么替换

命令替换

word怎么批量替换文字

sed多行模板替换

Linux Gvim shell 替换:变量替换,命令替换,转义字符