如何解决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 举报,一经查实,本站将立刻删除。