Skip to main content
 首页 » 编程设计

python之PyQt:如何在子类 QWidget 中接收键盘事件

2025年05月04日17oomusou

也许这个问题被问过很多次了,但我找不到解决方案。

我有一个对话框:

class PostDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
        QtGui.QDialog.__init__(self, parent) 
        self.ui = Ui_Dialog() #code from designer!! 
        self.ui.setupUi(self) 
 
        self.ui.plainTextEdit = ContentEditor() 

这个对话框有一个来自设计者的 QPlainTextEdit。

我需要覆盖 QPlainTextEdit 的 keyPress 和 keyRelease。

所以我已经将它子类化了:

class ContentEditor(QtGui.QPlainTextEdit): 
 
    def __init__(self, parent=None): 
        QtGui.QPlainTextEdit.__init__(self, parent) 
 
    def keyPressEvent(self, event): 
        print "do something" 

但 ContentEditor.keyPressEvent 从未被调用!为什么?

请您参考如下方法:

我推荐使用 installEventFilter为此目的:

这看起来像:

class PostDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
        QtGui.QDialog.__init__(self, parent) 
        self.ui = Ui_Dialog() #code from designer!! 
        self.ui.setupUi(self) 
 
        self.ui.plainTextEdit.installEventFilter(self) 
 
    def eventFilter(self, event): 
        if event.type() == QtCore.QEvent.KeyPress: 
            # do some stuff ... 
            return True # means stop event propagation 
        else: 
            return QtGui.QDialog.eventFilter(self, event)