当前位置: 首页 > 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.dtcms.com/a/311942.html

相关文章:

  • Python编程基础与实践:Python文件处理入门
  • 智能手表:MPU6050和水平仪,动态表情包
  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年1月15日真题
  • Qemu-NUC980(二):时钟clock代码添加
  • 驾驶场景玩手机识别:陌讯行为特征融合算法误检率↓76% 实战解析
  • 如何修复非json数据
  • 兰空图床部署教程
  • 从C++0基础到C++入门(第十五节:switch语句)
  • 工具包:位图格式一键生成可无限放大的矢量图SVG/EPS及CAD文件DXF
  • 我的世界模组开发教程——物品item(1)
  • 建筑施工场景安全帽识别误报率↓79%:陌讯动态融合算法实战解析
  • 深入 Vue v-model
  • SpringBoot启动项目详解
  • MC0351区间询问和
  • MybatisPlus-自动生成代码
  • 【走遍美国精讲笔记】第 1 课:林登大街 46 号
  • 深入 Go 底层原理(四):GMP 模型深度解析
  • 编译器与解释器:核心原理与工程实践
  • Linux I/O 系统调用完整对比分析
  • linux source命令使用详细介绍
  • [qt]QTreeWidget使用
  • JAVA国际版同城服务同城信息同城任务发布平台APP源码Android + IOS
  • 【设计模式】 原则
  • AI驱动SEO关键词智能进化
  • 具身智能VLA困于“数据泥潭”,人类活动视频数据是否是“破局之钥”?
  • 【Python修仙编程】(二) Python3灵源初探(10)
  • Spring 全局异常处理机制:多个 @ControllerAdvice 与重复 @ExceptionHandler
  • CMake 命令行参数完全指南 (1)
  • 数据结构1-概要、单向链表
  • JVM中的垃圾回收暂停是什么,为什么会出现暂停,不同的垃圾回收机制暂停对比