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
相关产品推荐
相关产品推荐

