问题描述
|
也许有人问过很多次,但我找不到解决方案。
我有一个对话框:
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之前绑定自定义窗口小部件。否则,您只是替换对已初始化对象的引用。