PyQt5中调用animateClick()时无法通过blockSignals阻止信号触发
解决animateClick()触发clicked信号的问题
我太懂这种困扰了——想让按钮用上animateClick()自带的流畅点击动画,但又不想触发它绑定的clicked信号,结果用blockSignals()居然没生效,属实闹心。
问题根源
你之前的代码没起效,核心原因是animateClick()是异步执行的:调用它之后,按钮的按下、保持、释放动画是在Qt的事件循环里逐步完成的,而你紧接着就调用了blockSignals(false),等动画结束按钮释放、准备发送clicked信号时,信号阻塞已经被取消了,所以信号还是会触发。
解决方案
只需要等动画完全结束后再解除信号阻塞就行,用Qt的定时器就能轻松实现:
Python 3.6 + PyQt5 版本
from PyQt5 import QtCore # 先阻塞信号 self.__myBtn.blockSignals(True) # 执行动画点击(这里用默认的100ms时长,如果你传了自定义时长,下面的定时器时间要对应) self.__myBtn.animateClick() # 延迟动画时长后解除阻塞,确保信号发送时阻塞仍生效 QtCore.QTimer.singleShot(100, lambda: self.__myBtn.blockSignals(False))
Qt5 C++ 版本
#include <QTimer> // 阻塞信号 myBtn->blockSignals(true); // 执行动画点击 myBtn->animateClick(); // 延迟100ms解除阻塞(自定义动画时长的话要同步修改这里的时间) QTimer::singleShot(100, [myBtn](){ myBtn->blockSignals(false); });
额外说明
如果你用了自定义的动画时长(比如animateClick(200)),记得把singleShot的时间改成对应的数值,确保阻塞覆盖整个动画周期。
内容的提问来源于stack exchange,提问作者K.Mulier
相关产品推荐
相关产品推荐

