槽函数不响应信号问题

时间:2022-10-10 14:43:04
qt4,一个继承自qthread类里面定义一个void信号。然后connect到一个全局变量(类)的槽函数。 当这个线程释放该信号的时候,全局变量的槽函数没有执行。但是奇葩的是,我还有一个继承自qthread的类,也是释放信号给这个全局变量的槽函数,却得到执行了。这两个线程基本一样,没多大区别。
我整个人都不好了。
有人可以告诉我,信号和槽,在使用过程中要注意什么吗?

9 个解决方案

#1


提个建议,你仔细看看connect函数的末尾参数type的用法

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType  type = Qt::AutoConnection)

#2


我试了Qt::AutoConnection和Qt::BlockingQueuedConnection,都不行。

#3


要把信号成功连接到槽,
1.信号的参数和槽的参数要有相同的顺序和类型
2.如果信号的参数比槽的参数多,则信号多出来的参数会被抛弃掉。如果参数类型不匹配或者信号或者槽不存在,Qt会在运行时发出警告。

你的情况是槽的参数比信号的参数多,这种情况应该连接不成功。可以尝试一下方式:
1.检查connect返回结果是不是成功
2.看运行时有没有发出信号和槽连接出问题的警告

#4


一,判断一下是不是真的发出信号了
二,信号和槽的参数类型是否一致

#5


这种问题非常容易查找问题:
你调试一下就能发现.这种情况一般是connect不成功.调试时你的应用程序输出会对连接不成功的connect报错.
连接不成功一般有几种原因:信号和槽函数参数不匹配; 自己写的信号和槽定义类没有加上Q_OBJECT; 忘记把moc_xxx.cpp给清除掉,导致错误连接.你最好的办法是单步执行到connect观察是否连接不成功.另外如果你的信号槽函数中间使用了自定义类型,并且信号槽是跨线程的,那么你要用qRegisterMetaType<ClassName>("ClassName")注册一下

#6


谢谢大家的回复,看了你们的回答,我继续测试了下,现统一回复:
1、信号和槽函数都是void xxxx();这种形式的,即无输入也无返回。
2、connect都返回true
3、两个继承自qthread的线程,connect到同一个全局变量(类)的不同槽函数。
      发出信号后一个槽函数得到执行,另一个无法执行。
4、我用的都是Qt::AutoConnection,其他我也试过,反正就是一个行一个不行。
5、关键最贱的地方是我写过简单测试程序,两个都得到执行了。
简直泪奔。。。。。。。。

#7


总结:
    我把connect函数写到了线程类的构造函数里,都得到了运行。然后把线程速度加快5ms执行一次,还是只有一个运行。我是测试不出什么问题了。
    如果有人遇到和我一样的问题,记得来我帖子下留言啊。

#8


我也遇到了楼主同样的问题,我在主窗体中添加了信号槽,子窗体执行完毕触发信号,主窗体响应信号刷新界面,子窗体和主窗体生命周期一样,另外,我的信号和槽函数都没有参数。我调试跟踪了,信号也发出了,就是执行不到槽函数。不知道楼主解决了问题没有?

#9


我的问题解决了,楼主你检查下你在绑定信号槽的时候,触发信号的对象有没有实例化,绑定信号槽时,信号和槽的两方都必须实例化才行。

#1


提个建议,你仔细看看connect函数的末尾参数type的用法

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType  type = Qt::AutoConnection)

#2


我试了Qt::AutoConnection和Qt::BlockingQueuedConnection,都不行。

#3


要把信号成功连接到槽,
1.信号的参数和槽的参数要有相同的顺序和类型
2.如果信号的参数比槽的参数多,则信号多出来的参数会被抛弃掉。如果参数类型不匹配或者信号或者槽不存在,Qt会在运行时发出警告。

你的情况是槽的参数比信号的参数多,这种情况应该连接不成功。可以尝试一下方式:
1.检查connect返回结果是不是成功
2.看运行时有没有发出信号和槽连接出问题的警告

#4


一,判断一下是不是真的发出信号了
二,信号和槽的参数类型是否一致

#5


这种问题非常容易查找问题:
你调试一下就能发现.这种情况一般是connect不成功.调试时你的应用程序输出会对连接不成功的connect报错.
连接不成功一般有几种原因:信号和槽函数参数不匹配; 自己写的信号和槽定义类没有加上Q_OBJECT; 忘记把moc_xxx.cpp给清除掉,导致错误连接.你最好的办法是单步执行到connect观察是否连接不成功.另外如果你的信号槽函数中间使用了自定义类型,并且信号槽是跨线程的,那么你要用qRegisterMetaType<ClassName>("ClassName")注册一下

#6


谢谢大家的回复,看了你们的回答,我继续测试了下,现统一回复:
1、信号和槽函数都是void xxxx();这种形式的,即无输入也无返回。
2、connect都返回true
3、两个继承自qthread的线程,connect到同一个全局变量(类)的不同槽函数。
      发出信号后一个槽函数得到执行,另一个无法执行。
4、我用的都是Qt::AutoConnection,其他我也试过,反正就是一个行一个不行。
5、关键最贱的地方是我写过简单测试程序,两个都得到执行了。
简直泪奔。。。。。。。。

#7


总结:
    我把connect函数写到了线程类的构造函数里,都得到了运行。然后把线程速度加快5ms执行一次,还是只有一个运行。我是测试不出什么问题了。
    如果有人遇到和我一样的问题,记得来我帖子下留言啊。

#8


我也遇到了楼主同样的问题,我在主窗体中添加了信号槽,子窗体执行完毕触发信号,主窗体响应信号刷新界面,子窗体和主窗体生命周期一样,另外,我的信号和槽函数都没有参数。我调试跟踪了,信号也发出了,就是执行不到槽函数。不知道楼主解决了问题没有?

#9


我的问题解决了,楼主你检查下你在绑定信号槽的时候,触发信号的对象有没有实例化,绑定信号槽时,信号和槽的两方都必须实例化才行。