当前位置: 首页 > 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.xdnf.cn/news/1229149.html

相关文章:

  • 电子电气架构 --- 汽车网络安全概述
  • Java高性能编程实践指南
  • cv弹窗,退款确认弹窗
  • Java中Lambda 表达式的解释
  • 【AI】AIService(基本使用与指令定制)
  • 操作系统:远程过程调用( Remote Procedure Call,RPC)
  • 公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描
  • java中的synchronized关键字​
  • 福彩双色球第2025088期篮球号码分析
  • PyTorch 张量核心操作——比较、排序与数据校验
  • 利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率
  • 深入 Go 底层原理(十五):cgo 的工作机制与性能开销
  • 探索:Uniapp 安卓热更新
  • 【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
  • 原生JS使用svg-pan-zoom库平移和缩放svg
  • 八股取士--docker
  • 【C++】第二十一节—一文详解 | 红黑树实现(规则+效率+结构+插入+查找+验证)
  • Day18--二叉树--530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先
  • 【MQ】kafka同步和异步的区别
  • 函数指针——回调函数
  • MybatisPlus-逻辑删除
  • Redis核心机制与实践深度解析:从持久化到分布式锁
  • 江协科技STM32 13-1 PWR电源控制
  • AG32mcu通过寄存器方式操作cpld
  • 3 使用 Jenkins 构建镜像:将你的应用打包成镜像
  • sqli-labs:Less-18关卡详细解析
  • 【隧道篇 / IPsec】(7.6) ❀ 02. 如何删除向导创建的IPsec安全隧道 (点对点) ❀ FortiGate 防火墙
  • K8S部署ELK(三):部署Elasticsearch搜索引擎
  • Java基础——实现图书管理系统交互功能
  • java实现运行SQL脚本完成数据迁移