PyQt:如何在子类化的QWidget中接收键盘事件?

问题描述

| 也许有人问过很多次,但我找不到解决方案。 我有一个对话框:
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)
    ,通过在Qt Designer中将QPlainTextEdit小部件升级为子类ContentEditor,可以更好地完成您要完成的任务。 Qt文档 在“升级的小部件”对话框中: \“升级类名称\”:ContentEditor \“头文件\”:your_python_module_name.h     ,可能是您需要调用QWidget的方法“ 3”来接收KeyPress事件。 从QWidget的API文档获取方法keyPressEvent: 对于事件事件,此事件处理程序可以在子类中重新实现 接收小部件的按键事件。小部件必须调用setFocusPolicy() 最初接受焦点并具有焦点以接收按键事件。     ,您可能只需要交换以下两行:
self.ui.setupUi(self)
self.ui.plainTextEdit = ContentEditor()
如果您这样写:
self.ui.plainTextEdit = ContentEditor()
self.ui.setupUi(self)
您需要确保在设置UI之前绑定自定义窗口小部件。否则,您只是替换对已初始化对象的引用。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...