qt中qvariant怎么转换成int
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt中qvariant怎么转换成int相关的知识,希望对你有一定的参考价值。
参考技术A 当然是可以转换的! 参考技术B int QVariant::toInt(bool * ok = 0) const替换 QVariant::Handler::canConvert
【中文标题】替换 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<int>()
一次,否则在编译期间您会遇到名称冲突,因此需要在一个专门化中添加所有自定义类型?另外,为了清楚起见,我建议添加canConvert
template<> bool QVariant::canConvert<int>() const if(userType() == QMetaTypeId<Foo>()) return true; else return canConvert(qMetaTypeId<int>());
否则它会破坏所有其他canConvert()
调用以上是关于qt中qvariant怎么转换成int的主要内容,如果未能解决你的问题,请参考以下文章