如何阻止空格键在 PyQt5 中触发聚焦的 QPushButton?

Posted

技术标签:

【中文标题】如何阻止空格键在 PyQt5 中触发聚焦的 QPushButton?【英文标题】:How to stop spacebar from triggering a focused QPushButton in PyQt5? 【发布时间】:2020-08-22 19:51:44 【问题描述】:

空格键被按下时,我希望按钮不触发;我该如何实现该功能?我找到了一个类似的post,但它是用c++ 写的,我怎么能把它翻译成python,但是把它的行为修改成我想要的?

【问题讨论】:

嗯,你真正的问题是什么?从 C++ 翻译成 python 还是你想要一个替代的解决方案? @eyllanesc 抱歉,我的问题令人困惑;从 c++ 翻译就足够了,但是如果有一种更简单的方法是让按钮永远不会有焦点并且更容易做到,那么这也是可以接受的。 那么你应该将你的问题改写为:我想停止按下 Ctrl + Space 时,调用按钮单击,而是在按下 Ctrl + Enter 时触发它,我该如何实现功能?在我的研究中,我发现了这个问题,但答案是用 C++ 编写的,我怎样才能将它翻译成 python? 好的,我的意图更清楚了。 嗯,您的问题发生了根本性的变化,据我了解,您不希望任何按下的键触发按钮单击,对吗?如果是这样,那么我的编辑修复了该错误。 【参考方案1】:

如果您想要触发按钮的任何键盘事件,那么只需实现一个事件过滤器:

import sys
from PyQt5 import QtCore, QtWidgets


class Listener(QtCore.QObject):
    def __init__(self, button):
        super().__init__(button)
        self._button = button
        self.button.installEventFilter(self)

    @property
    def button(self):
        return self._button

    def eventFilter(self, obj, event):
        if obj is self.button and event.type() == QtCore.QEvent.KeyPress:
            return True
        return super().eventFilter(obj, event)


App = QtWidgets.QApplication(sys.argv)

w = QtWidgets.QWidget()
lay = QtWidgets.QVBoxLayout(w)
btn = QtWidgets.QPushButton()
lay.addWidget(btn)
w.show()

btn.clicked.connect(print)

listener = Listener(btn)

sys.exit(App.exec())

【讨论】:

我不太精通 Qt 或 python,但我认为这不能回答我的问题。我想要一个忽略任何 keyPressed 事件的按钮。我输入的任何内容都不应该聚焦按钮并激活它。 @CarlosMedina 我不明白你,我认为你没有清楚地解释你想要什么。除了提供minimal reproducible example 之外,您能否详细解释您想要什么。您的问题令人困惑, QPushButton 具有焦点并且按下任何键都会导致单击触发。你测试过我的解决方案吗? 对不起,我打错了我的代码;按预期运行,谢谢。

以上是关于如何阻止空格键在 PyQt5 中触发聚焦的 QPushButton?的主要内容,如果未能解决你的问题,请参考以下文章

当用户按下其他控件/空格时,如何取消对UITextField的聚焦?

Kendo Grid 如何以编程方式聚焦网格单元并阻止选择文本

PyQt5 视频播放器:转换为面向对象的代码会阻止播放

小部件位置和窗口大小

Pyqt5 组合框允许搜索但阻止添加

关闭窗口时如何触发pyqt5信号[重复]