美文网首页
Qt中slot无法触发

Qt中slot无法触发

作者: e196efe3d7df | 来源:发表于2022-10-22 19:38 被阅读0次

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

    相关文章

      网友评论

          本文标题:Qt中slot无法触发

          本文链接:https://www.haomeiwen.com/subject/mrzizrtx.html