Qt中slot无法触发

2022-10-22  本文已影响0人  e196efe3d7df

最近遇到一个问题,使用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在主线程,还是需要信号的对象和槽的对象创建在主线程。

上一篇下一篇

猜你喜欢

热点阅读