当前位置: 首页 > news >正文

Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】

Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效

  • 引言
  • 一、问题描述
  • 二、解决方案
  • 三、深入了解信号和槽绑定机制

引言

之前刚遇到 - 信号和槽正常连接返回true,但发送信号后槽函数无响应问题,现在又遇到槽函数执行多次,使用Qt::UniqueConnection无效的问题… 有意思!

一、问题描述

  • 在函数a中new了一个类的实例,然后连接其信号和槽 (使用Lamda表达式实现槽函数),程序运行一段时间delete这个实例,然后又执行函数a重新new了另一个实例,重新连接其信号和槽. 然后发现槽函数被多次执行.
  • Note: Qt::UniqueConnections do not work for lambdas, non-member functions and functors; they only apply to connecting to member functions.
  • 注意:Qt::UniqueConnections不适用于lambda表达式、非成员函数和仿函数1;它仅适用于连接到成员函数。

二、解决方案

deleteQObject实例,并不会自动断开所有与之关联的信号和槽连接. 以下有三种解决方案:

    1. 手动调用disconnect()断开相关信号和槽
    1. 修改代码逻辑,保证其只连接一次
    1. 槽函数改为成员函数 (使用Qt::UniqueConnection需注意槽函数只能是成员函数)

参考链接:

  • Qt::UniqueConnection和lambda一块用无效:https://blog.csdn.net/weixin_46537765/article/details/134851130
  • 槽函数被执行多次的解决方法及Qt::UniqueConnection作用及和其它连接类型的“与”操作写法:https://blog.csdn.net/danshiming/article/details/123162126
  • Qt槽函数会被执行多次的问题原因及解决方法:https://blog.csdn.net/m0_52467164/article/details/131069560
  • Qt 多线程场景下,信号与槽绑定时采用Lamda表达试的一些坑:https://blog.csdn.net/sinat_15030309/article/details/147890907
  • Qt中信号未与槽函数断连就delete的问题:https://blog.csdn.net/weixin_45428995/article/details/141217712

三、深入了解信号和槽绑定机制

参考链接:

    1. QT中关于信号与槽机制的实现原理:https://blog.csdn.net/zht_xml/article/details/248738
      05年的老博客,每个QObject类都有一个QMetaObject类记录其元对象信息,然后利用元对象信息实现信号与槽机制,包括连接的建立和信号发生时激活的操作函数
      为什么Qt::UniqueConnections只适用于成员函数?难道只有QObject类的成员函数才会被记录元对象连接信息? - 比如Lambda表达式是一个匿名函数,即没有函数名,所以没法被记录么? 待深入了解其实现机制…
    1. 深入理解 Qt 信号与槽机制:原理、用法与优势:https://baijiahao.baidu.com/s?id=1823983825208540075
      编译阶段MOC (Meta - Object Compiler,元对象编译器) 会生成一个新的 C++ 源文件(通常命名为moc_<类名>.cpp)
    1. 元对象系统 MOC(Meta-Object Compiler 元对象编译器) :https://blog.csdn.net/cloud323/article/details/140185088

  1. 深入理解仿函数(Functors):从概念到实践: https://blog.csdn.net/2302_80836956/article/details/147892182 ↩︎

http://www.lryc.cn/news/607908.html

相关文章:

  • 24黑马SpringCloud的Docker本地目录挂载出现相关问题解决
  • Tushare对接OpenBB分析A股与港股市场
  • 解锁智能油脂润滑系统:加速度与温振传感器选型协同攻略
  • 深度学习核心:卷积神经网络 - 原理、实现及在医学影像领域的应用
  • 【Java】在一个前台界面中动态展示多个数据表的字段及数据
  • 定制开发开源AI智能名片S2B2C商城小程序的特点、应用与发展研究
  • 自进化智能体综述:通往人工超级智能之路
  • SpringBoot IOC
  • C++之vector类的代码及其逻辑详解 (中)
  • 【自动化运维神器Ansible】YAML语法详解:Ansible Playbook的基石
  • vue引入阿里巴巴矢量图库的方式
  • Kotlin协程极简教程:5分钟学完关键知识点
  • docker desktop入门(docker桌面版)(提示wsl版本太低解决办法)
  • 【MySQL】增删改查操作 —— CRUD
  • Elasticsearch 混合检索一句 `retriever.rrf`,把语义召回与关键词召回融合到极致
  • MySqL(加餐)
  • 在 AKS 中运行 Azure DevOps 私有代理-1
  • Cursor 与 VS Code 与 GitHub Copilot 的全面比较
  • 字节Seed发布扩散语言模型,推理速度达2146 tokens/s,比同规模自回归快5.4倍
  • [spring6: 分布式追踪]-实战
  • AI赋能测试:技术变革与应用展望
  • 在ChinaJoy ,Soul发布“莫比乌斯·第三弹”ChinaJoy特别款
  • 深入 Go 底层原理(十二):map 的实现与哈希冲突
  • 高性能实时分析数据库:Apache Druid 查询数据 Query data
  • RK3399 启动流程 --从复位到系统加载
  • 变频器实习DAY20 测试经验总结
  • .NET 中,Process.Responding 属性用于检查进程的用户界面是否正在响应
  • 【嵌入式汇编基础】-ARM架构基础(三)
  • u-boot启动过程(NXP6ULL)
  • 网络常识-子网掩码