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

 更新时间:2023年01月06日 10:38:38   作者:荆楚闲人  
本文主要介绍了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槽函数执行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++实现十进制转换成16进制示例

    c++实现十进制转换成16进制示例

    这篇文章主要介绍了c++实现十进制转换成16进制示例,需要的朋友可以参考下
    2014-05-05
  • C++ 数据结构线性表-数组实现

    C++ 数据结构线性表-数组实现

    这篇文章主要介绍了C++ 数据结构线性表-数组实现的相关资料,需要的朋友可以参考下
    2017-06-06
  • 详解用C语言实现三子棋游戏流程

    详解用C语言实现三子棋游戏流程

    三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了
    2021-11-11
  • 利用C语言替换文件中某一行的方法

    利用C语言替换文件中某一行的方法

    大家都知道C语言提供了文件操作,但是替换文件的某一行比较麻烦,下面是我使用的一个方法,现在分享给大家,有需要的朋友们可以参考借鉴。
    2016-09-09
  • C++设计模式编程之Flyweight享元模式结构详解

    C++设计模式编程之Flyweight享元模式结构详解

    这篇文章主要介绍了C++设计模式编程的Flyweight享元模式结构,享元模式在实现过程中主要是要为共享对象提供一个存放的"仓库"(对象池),需要的朋友可以参考下
    2016-03-03
  • 浅析c++中new和delete的用法

    浅析c++中new和delete的用法

    以下是对c++中new和delete的用法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++中hashmap的一些使用建议

    C++中hashmap的一些使用建议

    由于hashmap不是c++ stl中标准实现,这样在跨平台使用时就可能会出现问题,下面这篇文章主要给大家介绍了关于C++中hashmap的一些使用建议,需要的朋友可以参考下
    2023-03-03
  • atoi和itoa函数的实现方法

    atoi和itoa函数的实现方法

    本文介绍了,atoi和itoa函数的实现方法,需要的朋友可以参考一下
    2013-03-03
  • c++编程学习的技巧总结

    c++编程学习的技巧总结

    在本篇文章里小编给大家分享了关于c++编程学习的技巧以及知识点总结,需要的朋友们学习下。
    2019-03-03
  • C++ 大根堆排序学习笔记

    C++ 大根堆排序学习笔记

    这篇文章主要为大家介绍了C++ 大根堆排序的学习教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论