Qt槽函数会被执行多次的问题原因及解决方法

今天在项目中发现发送一次信号,槽函数被执行多次,如下:

connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);

pBtn为按钮。上述代码在一个循环中被连接信号槽多次 ,单击一次pBtn按钮,槽函数QtWidgetsApplication2::btnClicked被响应了多次。我原以为connect会将上次连接的信号槽覆盖掉,看来这货是每次累加啊,即connect几次就发送几次。解决方法有两种:

1.在最后一个参数加入Qt::UniqueConnection,如下:

connect(ui.btn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked, Qt::UniqueConnection);

Qt::UniqueConnection的作用是:如果该信号以前没连接过,则连接它,返回true,如果以前连接过,则不再连接,返回false。

2.用disconnect函数先断开连接,再重新connect

如下:

 QMetaObject::Connection connectHandler = connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);

// 先断开连接
disconnect(connectHandler); 

// 重新连接
connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked);

另外如下也会执行多次:

connect(ui.pushButtonSwitch, SIGNAL(clicked(bool)), this, SLOT(on_pushButtonSwitch_clicked(bool)));
其中on_pushButtonSwitch_clicked(bool)函数的命名是on_对象名_signal名的规则,而这正是Qt的信号-槽默认的连接规则,也就是说你不对按钮进行任何connect时,而仅仅只是把槽函数写成on_对象名_signal形式,qt也会自动执行该函数,一旦你connect了按钮的clicked信号但响应clicked信号的槽函数命名不是on_对象名_signal名的规则,那么qt就不会自动执行on_对象名_signal名的规则函数,转而执行你定义的槽函数。上面代码connect信号到qt默认的信号-槽默认连接规则的槽函数上,且槽函数命名是on_对象名_signal名的规则,所以qt会执行两次,一次是connect连接的,一次是qt默认的(默认的槽函数和你conenct连接的槽函数相同,所以执行了两次)

到此这篇关于Qt槽函数会被执行多次的问题原因及解决方法的文章就介绍到这了,更多相关Qt槽函数执行内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++11 写一个只触发一次槽函数的Qt connect函数

    目录 引言 ConnectionUtil.h: ConnectionUtil.cpp: 引言 在之前的Qt项目中,我发现经常会用到槽函数只需要执行一次的情况.也就是说,槽函数执行一次后,就需要disconnect对应的连接.然而,真正操作起来实际上挺麻烦的,或者说不优雅. 因为你需要把之前connect时产生的QMetaObject::Connection对象保存起来,而保存它不能用局部变量,通常需要保存到类的成员变量中,或者其他生命周期足够长的地方,以防止在disconnect它的时候,它已经

  • Qt 信号自定义槽函数的实现

    目录 使用无参数信号与槽 使用有参信号传递 点击按钮触发信号 匿名函数与槽 Qt中实现自定义信号与槽函数,信号用于发送并触发槽函数,槽函数则是具体的功能实现,如下我们以老师学生为例子简单学习一下信号与槽函数的使用方法. 使用无参数信号与槽 首先定义一个teacher类,该类中用于发送一个信号,其次student类,定义用于接收该信号的槽函数,最后在widget中使用emit触发信号,当老师说下课时,学生请客吃饭. teacher.h 中只需要定义信号.定义一个 void hungry(); 信号

  • Qt中简单的按钮槽函数传递参数方法

    目录 Qt按钮槽函数传递参数方法 Qt槽函数的几种用法 通过ui控件添加槽函数 通过connect连接 Qt按钮槽函数传递参数方法 Qt中一个典型的点击按钮触发槽函数的写法是: connect(btn, &QPushButton::clicked, this, &class::func); 当你希望在点击按钮后再向槽函数中传递参数,这种写法就无法做到了. 其原因是槽函数要和信号的参数完全对应,如果修改了传给槽函数的参数,点击按钮的信号就无法处理. 这里给出一个比较简单的传参方法,在信号槽中

  • Qt槽函数会被执行多次的问题原因及解决方法

    今天在项目中发现发送一次信号,槽函数被执行多次,如下: connect(pBtn, &QAbstractButton::clicked, this, &QtWidgetsApplication2::btnClicked); pBtn为按钮.上述代码在一个循环中被连接信号槽多次 ,单击一次pBtn按钮,槽函数QtWidgetsApplication2::btnClicked被响应了多次.我原以为connect会将上次连接的信号槽覆盖掉,看来这货是每次累加啊,即connect几次就发送几次.解

  • jQuery通过ajax方法获取json数据不执行success的原因及解决方法

    1.jquery通过ajax方法获取json数据不执行success回调 问题描述:jquery通过ajax方法获取json数据不执行success回调方法 问题原因:json格式存在问题或不符合标准写法,导致总是执行error回调方法 解决方案:使json格式务必符合下述3个标准写法: 1)键名称:用双引号括起: 2)字符串:用双引号括起: 3)数字,布尔值不需要使用双引号括起 : 注意:一定是双括号! 2.jQuery中ajax使用json数据类型总是跳过success执行error语句 执

  • Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法

    本文实例讲述了Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法.分享给大家供大家参考,具体如下: 前言: 想把QQ日志爬虫(Python)爬下来的日志保存到 MongoDB 里面. 但 insert 的时候报错: E11000 duplicate key error collection: QQ.Blog index: _id_ dup key: { : "965464518_1301232446" } 后来知道错误的原因是:插入的数据和已有数据的 ID

  • 详解win7 cmd执行vue不是内部命令的解决方法

    详解win7 cmd执行vue不是内部命令的解决方法 通过全局安装vue-cli npm install --global vue-cli 在cmd中运行vue提示不是内部命令,原因是环境变量没有加上 找到npm的位置:(不在这个位置的全局搜索vue.cmd即可) C:\Users\Administrator\AppData\Roaming\npm 打开我的电脑-->右键属性-->高级系统设置-->环境变量-->Path-->添加获得npm的位置,保存,重启cmd命令工具即可

  • laravel执行php artisan migrate报错的解决方法

    报错一 $ php artisan migrate Illuminate\Database\QueryException : could not find driver (SQL: select * fr om information_schema.tables where table_schema = dev_oms and table_name = migra tions) at D:\WWW\dev_oms\vendor\laravel\framework\src\Illuminate\D

  • Windows 2008任务计划执行bat脚本失败返回0x1的解决方法

    测试环境: C:\>systeminfo | findstr /c:"OS Name" OS Name: Microsoft Windows Server 2008 R2 Enterprise 很多人在Windows 2008里面创建任务计划执行bat文件的时候都会遇到这样的问题:任务计划执行之后返回的状态码是0x1而不是正常的0x0 我今天也被这个问题给坑了,几乎花了一天的时间来排错.单独执行bat脚本一切正常,在Windows 2003的任务计划里面执行bat脚本也没有问题,

  • PHP函数__autoload失效原因及解决方法

    1.利用sprintf()函数来格式化,语法"sprintf("%.小数位数f",$num)". <?php header("Content-type:text/html;charset=utf-8"); $num = 10.4567; $format_num = sprintf("%.2f",$num); echo $format_num; //10.46 ?> 2.利用number_format()函数,语法&

  • 关闭页面window.location事件未执行的原因及解决方法

    1.问题描述: JS中定义widow.location = function(),页面关闭时,logout()函数未执行. window.onunload = function() { logout(); } function logout(reqParam, callback){ var userManageServiceUrl = "http://" + getServerAddr() + "/axis2/services/UserManageService";

  • vue组件中节流函数的失效的原因和解决方法

    今天使用节流函数的时候遇见了一个问题,搞了半天才找到原因,所以在这里做个总结. 节流函数 浏览器的一些事件,如:resize,scroll,mousemove等.这些事件触发频率太过频繁,绑定在这些事件上的回调函数会不停的被调用,加重浏览器的负担,导致用户体验非常糟糕.所以先贤们发明了节流函数,简单版本如下: function throttle (f, wait = 200) { let last = 0 return function (...args) { let now = Date.no

  • dos里执行tracert命令只有一跳的原因及解决方法

    一直以来,我在家电脑DOS里执行Tracert命令时都只看到只有一跳的返回结果,令我非常不解.我原以为是电信运营商那边的问题,所以也就一直没去追究是什么真正的原因. C:\Documents and Settings\Administrator>tracert www.baidu.com Tracing route to www.a.shifen.com [220.181.111.148]over a maximum of 30 hops: 1     45 ms    46ms    46ms

随机推荐