Qt中slot无法触发

最近遇到一个问题,使用connect连接signal和slot,但是slot却无法触发,最后凭经验摸索了出来,总结一下slot无法触发的几种情况:

1. 没有继承自QObject,没有添加Q_OBJECT

如果想使用connect,则声明signal和slot所在的类,必须继承自QObject,且一定要引入Q_OBJECT宏。
看一下官方文档是怎么说的:

请注意,Q_OBJECT宏对于实现信号、插槽或属性的任何对象都是必需的。您还需要在源文件上运行元对象编译器。我们强烈建议在QObject的所有子类中使用此宏,无论它们是否实际使用信号、插槽和属性,因为如果不这样做,可能会导致某些函数表现出奇怪的行为。

2. 声明signal,slot

请注意如果你使用的是以下方式:

connect(myButton, SIGNAL(clicked()), this, SLOT(buttonClicked()));

也就是使用宏SIGNAL,SLOT方式,声明信号函数和槽函数时,一定要把使用signalsslots进行包裹。

3. 自定数据类型作为参数

这种情况比较多见,如果你是使用自定义类型作为signal和slot的参数,这个时候编译链接是不会报错的,但是运行期间会有一个warning,提示你使用qRegisterMetaType去注册。

4. connect的调用一定在主线程中

这个问题最好不好查,请在主线程中调用connect来连接信号和槽,否则也是无法触发的。
迄今为止,我还没弄清楚是需要connect在主线程,还是需要信号的对象和槽的对象创建在主线程。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这篇文档从使用到实现去讲信号-槽,适合小白到使用一两年的。对于Qt使用而言,信号-槽是我们津津乐道的一个功能,那我...
    开发呆呆阅读 6,684评论 0 0
  • 为什么要是用多线程? 多线程的使用主要是为了处理比较耗时的过程。多线程的实现可以通过两种方式实现分别是:1.继承Q...
    yusiling阅读 9,190评论 0 0
  • 1 实验目的 目前计算机视觉技术已经比较成熟,相关的开源项目与算法很多,可以将这些开源算法进行整合,进而做成一个小...
    YOUNG_FAN阅读 11,810评论 0 50
  • 为什么在头文件中有的是使用前置声明,而有的是包含头文件? 如下代码: 前置声明(forward declarati...
    Joe_HUST阅读 5,189评论 0 6
  • 参考:Qt for Python Signals and Slots 和 Signals & Slots 及 Su...
    水之心阅读 8,833评论 0 3

友情链接更多精彩内容