把发送信号的那个类的变量定义在一个函数里,信号就发不出去,定义在类的成员变量,就能发出去信号,求指导

算球? 2019-10-15 02:04:00
如图所示,把watcher放在类成员里,信号就能发出去,watcher放在函数里,信号就发不出去,我是想当新开的线程执行完,watcher就被销毁了,所以发不出去信号了。图片里这种情况就是发不出去信号的。
请问各位大佬有何高见?希望各位能给一些相关的资料看看,比如就是这种情况下的,发送信号的变量被销毁了就发不出去信号了,可是之前建立了信号和槽的连接了,发信号的没了,那那个连接去哪里了?
...全文
219 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly1chee 2019-10-16
  • 打赏
  • 举报
回复
watcher作为一个局部对象,作用域结束之后就销毁了,信号当然发不出去。一个QObject对象析构的时候会把所有已连接的信号断开,QObjectPrivate::connectionLists和QObjectPrivate::senders分别是当前对象信号的接收方和信号的发送方,析构的时候会遍历这2个列表把所有连接都断开,有兴趣你可以看看QObject析构函数的源码。

如果你是想当线程结束之后销毁watcher,可以试试这句代码:QObject::connect(watcher, &QFutureWatcher<int>::finished, watcher, &QObject::deleteLater);
dinjay 2019-10-16
  • 打赏
  • 举报
回复
不明白你想实现什么效果,如果只是想发送信号,那放倒成员变量里就行了。如果想随着线程一起销毁,那你可以new出来一个watcher,然后线程退出的时候delete这个watcher就行了
  • 打赏
  • 举报
回复
我没记错的话Qt带信号槽的都是来自QObject的,所以去官网文档查应该能得到你想要的。 在槽函数中定义一个临时变量,执行完就销毁了,自然就没有信号发出了,至于连接,官网有段这么描述的: 该函数(指connect())返回一个QMetaObject:Connection,它表示连接的句柄,如果它成功地将信号连接到插槽。如果连接句柄无法创建连接,例如,如果QObject无法验证信号或方法的存在,或者它们的签名不兼容,则连接句柄将无效。您可以通过将句柄转换为bool来检查该句柄是否有效。 我把你的类换QTimer举例,定义一个局部 QTimer t; 往往在函数返回后就销毁了,保存connect句柄,可以看到在函数返回前句柄还是 true,返回后就变成了 false,句柄失效。 销毁就是那段内存都没了,所以想保持连接就需要分配内存到别的地方,不被自动销毁,static QTimer t;或者QTimer *t = new QTimer;都可以使连接保持有效。 连接去哪了这个问题,connect函数应该实际上是QObject::connect(); 可能跟着销毁就没了,需要去官网找一下答案。

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧