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

http://blog.sina.com.cn/s/blog_48d4cf2d0102vdy4.html

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技术,所以拷贝构造函数运行速度是很快的。很适用于信号槽这种封包机制。因为封包本质上就是把函数的地址和函数的所有入参都保存起来,所以免不了调用函数入参的拷贝构造函数。
 



猜你喜欢

转载自blog.csdn.net/chenyijun/article/details/79659760