在QT的信号和槽中使用自定义类型
2015-10-10 09:23
260 查看
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程序如何获知鼠标enter/leave通…
- 如何使用系统默认浏览器打开QTextB…
- 示范如何让QT控件捕捉键盘事件实现…
- 更改QTreeView, QListView在window…
- QTableWidget美化细节
- QT中QImage读取GIF格式图像失败的…
- QT中用Qpainter的drawText方法程序…
- QT4.6中将QImage保存为JPG格式
- PyQt5程序(二)
- jqTransform美化表单
- win764 QTCreator2.8.0+Qt Open source 4.8.5环境配置(Win7x64)
- QT QSemaphore 线程同步
- qt获取当前时间以及日期
- QT多线程中的互斥与同步
- Qt Creator 3.2.1(基于QT5)解决无法输入中文
- qt 打印 QPrinter类
- QT 布局
- QT弹出消息框
- Qt多线程编程
- windows下完美的"免费"QT开发环境: QtCreator + VC2008Express