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

PyQt5如何强制将键盘焦点锁定在指定QGroupBox或控件上

问题根因

你遇到的问题和QGroupBox焦点无关,核心是你给窗口内所有QPushButton都设置了setDefault(True)属性:

  • 被设为默认按钮的QPushButton,只要当前窗口处于激活状态,无论焦点是否在按钮上,按下回车键都会触发它的clicked信号
  • 同时你给所有QLineEdit绑定了returnPressed信号,按下回车键时两个信号同时触发,才会出现一次回车执行多个函数的现象

解决方案

两种方案选一种就行,按需调整:

方案1(推荐):移除不必要的默认按钮设置

删掉代码里所有按钮的.setDefault(True)语句,除非你确实需要某个按钮具备全局回车触发的能力。
需要删除的语句如下:

# createConnectToCOM方法内
self.updatePushButton.setDefault(True)
self.connectPushButton.setDefault(True)
# createPositionControlPanel方法内
sendPushButton.setDefault(True)
# createPushButtonsPanel方法内
self.homingPushButton.setDefault(True)
recPosPushButton.setDefault(True)

方案2:拦截输入框的回车事件,不传递给父窗口

如果你需要保留部分按钮的默认触发逻辑,可以修改QLineEdit的事件处理逻辑,让输入框按下回车时只触发自身绑定的returnPressed信号,不向上传递给窗口触发默认按钮。只需要修改PositionDescriber类的初始化逻辑即可:

class PositionDescriber:
    """ Label and widget associated for each axis. Save some writing later """
    def __init__(self, labelText, initVal=0.0):
        self.posLabel = QLabel(labelText)
        self.value = initVal
        self.posWidget = QLineEdit(str(self.value))
        # 新增下面的事件重写逻辑
        original_key_press = self.posWidget.keyPressEvent
        def custom_key_press(e):
            if e.key() in (Qt.Key_Return, Qt.Key_Enter):
                self.posWidget.returnPressed.emit()
                e.accept()
            else:
                original_key_press(e)
        self.posWidget.keyPressEvent = custom_key_press

验证

改完后运行程序,在输入框按下回车只会触发registerInput函数,不会再触发按钮的点击事件,问题即可解决。

内容的提问来源于stack exchange,提问作者The rag on din

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:27:02