You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

核心修改点

  1. 新增事件来源校验,只有事件触发对象是主窗口本身时才走自定义拖动逻辑
  2. 鼠标释放事件新增右键判定,左键释放事件不会被拦截,子控件可以正常接收点击事件

内容的提问来源于stack exchange,提问作者CID An Education Hub

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:27:04