监听键盘无效的原因
我在照例子学习的过程中遇到了键盘事件无效的情况,比如
from PySide2.QtWidgets import *
from PySide2.QtCore import Qt
class Example(QWidget):
def __init__(self):
self.initUI()
def initUI(self):
self.window = QMainWindow()
self.window.resize(200, 100)
self.window.setWindowTitle('窗口')
self.textEdit = QLineEdit(self.window)
self.textEdit.setPlaceholderText("按回车试试")
self.textEdit.move(50, 30)
self.window.show()
# 这里定义了键盘监听事件,然并卵,根本没有执行
def keyPressEvent(self, event):
if event.key() == Qt.Key_Return:
print('按下回车')
if __name__ == '__main__':
app = QApplication()
window = Example()
app.exec_()
通过排查发现,keyPressEvent
只监听主窗体,你要是在上面加个输入框之类的,它就不鸟你了。肯定可以把这个函数和控件结合起来,只不过我还不会。
解决方法一:QLineEdit自带的信号
QLineEdit自带了一个信号 returnPressed
代码可以改为:
from PySide2.QtWidgets import *
from PySide2.QtCore import Qt
class Example(QWidget):
def __init__(self):
self.initUI()
# 用returnPressed信号来监听
self.textEdit.returnPressed.connect(self.keypress)
def initUI(self):
self.window = QMainWindow()
self.window.resize(200, 150)
self.window.setWindowTitle('窗口')
self.textEdit = QLineEdit(self.window)
self.textEdit.setPlaceholderText("按回车试试")
self.textEdit.move(50, 30)
self.textEdit2 = QLineEdit(self.window)
self.textEdit2.setPlaceholderText("按回车试试")
self.textEdit2.move(50, 70)
self.window.show()
def keypress(self):
print('你按了一下回车')
if __name__ == '__main__':
app = QApplication()
window = Example()
app.exec_()
解决方法二:事件过滤器
事件过滤器似乎值得好好研究一下,目前我知道的用法是现在控件上installEventFilter
,然后在下面写个eventFilter(self, widget, event)
函数
from PySide2.QtWidgets import *
from PySide2.QtCore import Qt, QEvent
class Example(QWidget):
def __init__(self):
super(Example, self).__init__() # 这里要这么写,我也不知道为什么
self.initUI()
self.textEdit.installEventFilter(self) # 相当于绑定了事件过滤器
def initUI(self):
self.window = QMainWindow()
self.window.resize(200, 150)
self.window.setWindowTitle('窗口')
self.textEdit = QLineEdit(self.window)
self.textEdit.setPlaceholderText("按回车试试")
self.textEdit.move(50, 30)
self.textEdit2 = QLineEdit(self.window)
self.textEdit2.setPlaceholderText("按回车试试")
self.textEdit2.move(50, 70)
self.window.show()
def eventFilter(self, widget, event): # 定义事件过滤器
if event.type() == QEvent.KeyPress: # 先判断事件类型是否是键盘事件
if event.key() == Qt.Key_Return: # 再判断是否是回车
print('你按了一下回车')
# 这里要return,要不然会报错
return QWidget.eventFilter(self, widget, event)
if __name__ == '__main__':
app = QApplication()
window = Example()
app.exec_()