PySide2中键盘事件无效的原因及解决方法

监听键盘无效的原因

我在照例子学习的过程中遇到了键盘事件无效的情况,比如

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_()

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值