Qt中安装于QWidget主窗口的eventFilter导致按钮点击失效并保持选中状态
问题原因
- 你的eventFilter逻辑存在两处拦截错误:
- 无条件拦截了所有鼠标释放事件:不管按下的是左键还是右键、事件来源是主窗口还是子按钮,只要触发
MouseButtonRelease就直接返回True,导致按钮点击后收不到左键释放信号,一直卡在选中状态,也无法触发点击回调 - 没有限制事件来源:哪怕鼠标在子控件上触发右键相关事件,也会被拦截处理,干扰子控件的原生事件逻辑
- 无条件拦截了所有鼠标释放事件:不管按下的是左键还是右键、事件来源是主窗口还是子按钮,只要触发
解决方案
修改eventFilter逻辑,仅处理主窗口自身的右键相关鼠标事件,其余事件全部正常透传:
def eventFilter(self, source, event): try: # 子控件触发的事件直接透传,不做拦截处理 if source != self: return super(Ui_digiWidget, self).eventFilter(source, event) if (event.type() == QtCore.QEvent.MouseButtonPress and event.button() == QtCore.Qt.RightButton): self.startPos = event.pos() return True elif event.type() == QtCore.QEvent.MouseMove and self.startPos is not None: self.move(self.pos() + event.pos() - self.startPos) return True elif event.type() == QtCore.QEvent.MouseButtonRelease and event.button() == QtCore.Qt.RightButton: # 仅处理右键的释放事件,左键释放正常透传给控件 self.startPos = None return True return super(Ui_digiWidget, self).eventFilter(source, event) except Exception as e: print(e)
核心修改点
- 新增事件来源校验,只有事件触发对象是主窗口本身时才走自定义拖动逻辑
- 鼠标释放事件新增右键判定,左键释放事件不会被拦截,子控件可以正常接收点击事件
内容的提问来源于stack exchange,提问作者CID An Education Hub
相关产品推荐
相关产品推荐

