在QT的信号和槽中使用自定义类型

  QT的信号和槽机制由于实现的年代比较久远,所以采用的是代码预编译而不是更时髦的模板技术来实现。但实际使用起来还是挺方便的。也能够很好地用于跨线程的通信场景,比如后台线程取到数据后通知UI线程显示。
           最近遇到一个有趣的问题:我们在一个信号中用了自定义类型,之前使用完全没有问题。后来我们改到非UI线程中发射信号,结果槽函数就调用不到了。
            通过查看运行时日志,发现QT在connect信号的时候有警告:QObject::connect: Cannot queue arguments of type 'Foo'  (Make sure 'Foo' is registered using qRegisterMetaType().) 。 通过查看,原来QT如果要在信号中使用自定义类型,需要首先调用qRegisterMetaType函数,语句类似  qRegisterMetaType<Foo>("Foo");
           其实不止是自定义类型,包括QList这种QT的容器类也是一样的。估计QT只是给少数几个类如QString注册了。还有少数原生类型,比如发现__int64也是需要注册的,qRegisterMetaType <__int64 >( "__int64 ");。
           另外有个建议:就是使用信号和槽的时候,尽量使用QT而不是标准库的容器类,比如QString、QList等等。这主要是出于性能上的考虑。QT的容器包括QString都使用了implicitly  shared技术,所以拷贝构造函数运行速度是很快的。很适用于信号槽这种封包机制。因为封包本质上就是把函数的地址和函数的所有入参都保存起来,所以免不了调用函数入参的拷贝构造函数
转载于:http://blog.sina.com.cn/s/blog_48d4cf2d0102vdy4.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值