在PyQt5中,按钮(QPushButton)的默认行为是,当它获得焦点并且用户按下Enter键时,会触发点击事件。如果想要取消这个行为,有以下三种方法。
方法一、重写按钮的KeyPressEvent方法。
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget
from PyQt5.QtCore import Qt
import sys
class Button(QPushButton):
def __init__(self, title, parent):
super().__init__(title, parent)
def keyPressEvent(self, event):
if event.key() == Qt.Key_Enter or event.key() == Qt.Key_Return:
return
super().keyPressEvent(event)
class App(QWidget):
def __init__(self):
super().__init__()
self.button = Button('Button', self)
self.button.move(50, 50)
self.setGeometry(300, 300, 300, 200)
app = QApplication(sys.argv)
ex = App()
ex.show()
sys.exit(app.exec_())
在这个例子中,我们创建了一个新的按钮类 Button,它继承自 QPushButton。我们重写了 keyPressEvent 方法,使得当按下 Enter 键或 Return 键时,不会触发任何事件。其他的按键事件会按照默认的方式处理。
方法二、给应用程序或窗口类中安装一个事件过滤器,然后在 eventFilter
方法中拦截并处理按钮的键盘事件。
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget
from PyQt5.QtCore import Qt, QEvent
import sys
class App(QWidget):
def __init__(self):
super().__init__()
self.button = QPushButton('Button', self)
self.button.installEventFilter(self) # 为 self.button安装事件过滤器
self.button.move(50, 50)
self.setGeometry(300, 300, 300, 200)
def eventFilter(self, obj, event):
if obj == self.button and event.type() == QEvent.KeyPress:
if event.key() in (Qt.Key_Enter, Qt.Key_Return):
return True
return super().eventFilter(obj, event)
app = QApplication(sys.argv)
ex = App()
ex.show()
sys.exit(app.exec_())
在这个例子中,我们在 self.button 上安装了一个事件过滤器,然后在 eventFilter 方法中检查是否为按钮的键盘按键事件。如果是,并且按键为 Enter 键或 Return 键,我们返回 True 来拦截并忽略这个事件。其他的事件会按照默认的方式处理
方法三、在QT Designer中,修改QPushButton按钮的"focusPolicy"为"NoFocus"