Qt中槽函数触发两次的两种场景分析

    在Qt开发中,有两种情况能够触发槽函数被触发两次,第一种情况是必现的,属于错误的写法,是指信号和槽关联两次;第二种情况是偶然出现的,是指对信号没有正确理解导致的。

1.信号与槽关联两次

    通常这种情况下发生在混合编程的情况下,即既使用了UI来进行布局,又使用来代码来关联信号,使得信号和槽关联两次。不妨以QPushButton中的button为例,通常在使用ui文件布局中自动生成的文件中会调用这样一句话:

QMetaObject::connectSlotsByName();

这样则代表隐式调用connect(button, &QPushButton::clicked, this, &myWidget::on_button_clicked);此时开发者只需要实现on_button_clicked即可,如果再在代码中显示添加信号和槽连接,则会触发槽函数两次

 

2.QPushButton中的pressed,released, clicked信号

    通常这种情况发生在对信号的关联上,以QPushbutton为例,其他的如果有类似情况可以延伸,首先复现这种场景需要正确理解QPushButton中的三种信号:pressed指的是鼠标左键按下的动作,released指的是鼠标左键抬起的动作,clicked指的是鼠标左键按下并抬起的动作,因此触发优先级为pressed>released>clicked.

   考虑场景,关联pressed信号,测试鼠标快速点击button,点击button关闭对话框并打印进入对话框的次数,测试发现:在多次尝试后,会出现概率性的一次点击,进入两次对话框的情况,但是关联clicked信号却不会出现这种情况。

  避免情况:因此,如果不需要区分三种信号触发的优先级,建议在开发过程中尽量使用clicked信号。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值