最近遇到一个问题,使用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方式,声明信号函数和槽函数时,一定要把使用signals
和slots
进行包裹。
3. 自定数据类型作为参数
这种情况比较多见,如果你是使用自定义类型作为signal和slot的参数,这个时候编译链接是不会报错的,但是运行期间会有一个warning,提示你使用qRegisterMetaType
去注册。
4. connect的调用一定在主线程中
这个问题最好不好查,请在主线程中调用connect来连接信号和槽,否则也是无法触发的。
迄今为止,我还没弄清楚是需要connect在主线程,还是需要信号的对象和槽的对象创建在主线程。
网友评论