微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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之前绑定自定义窗口小部件。否则,您只是替换对已初始化对象的引用。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。