在QT的信号和槽中使用自定义类型
2017-03-29 16:54
232 查看
原文: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技术,所以拷贝构造函数运行速度是很快的。很适用于信号槽这种封包机制。因为封包本质上就是把函数的地址和函数的所有入参都保存起来,所以免不了调用函数入参的拷贝构造函数。
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技术,所以拷贝构造函数运行速度是很快的。很适用于信号槽这种封包机制。因为封包本质上就是把函数的地址和函数的所有入参都保存起来,所以免不了调用函数入参的拷贝构造函数。
相关文章推荐
- Qt使用自定义类型信号槽注册问题
- Qt-信号和槽中使用自定义数据类型
- Qt-信号和槽中使用自定义数据类型
- 在QT的信号和槽中使用自定义类型
- Qt 线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)
- 在QT的信号和槽中使用自定义类型
- 如何在Qt中使用自定义数据类型
- Qt自定义类型的注册与使用
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- QT 自定义信号与信号槽方法及解决自定义数据类型或数组作为函数参数的问题
- Qt中带有参数的信号传递出错--自定义类型的参数
- 如何在Qt中使用自定义数据类型
- Qt ------ QWidget 自定义子类使用信号与槽(Q_OBJECT)后 stylesheet 失效
- qt 中自定义信号类型方法
- Qt实例分析——C++自定义类型的属性在QML的使用
- Qt信号之自定义数据类型
- qt信号槽接收不到的情况(自定义数据类型+多线程)
- QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类
- Qt信号槽机制的实现(面试的感悟,猜测每一个类保存的一个信号和槽的二维表,实际使用函数指针 元对象 还有类型安全的检查设定等等)
- QT信号和槽使用自定义的类或结构体