处理 QTextEdit 事件的问题()
Problems handling QTextEdit event()
我在 Qt Designer 中开发了一个图形用户界面,其中显示了一个 QTextEdit 小部件。
我需要处理用户输入某些组合键(到目前为止,TAB 键、SHIFT + ENTER 和 SHIFT + RETURN),这样它就不会在 QTextEdit 小部件中显示这些字符并实现一些自定义功能。
我已经创建了一个处理程序来检测 keyReleaseEvents,但这似乎为时已晚,无法阻止显示制表符、回车 returns 等,所以我尝试处理 keyPressEvents,但这似乎根本不起作用。根据我在网上阅读的内容,人们说 keyPressEvent 正在被小部件消耗,因此永远不会传播到 gui。我对 QTextEdit 小部件的了解还不够多,无法判断这是否正确,但现在我假设它是正确的。
然后我在 gui 的 class __init__
方法中尝试了这个(我省略了对 RETURN 键的检查以使下面的代码简短:
self.textEdit.event = self.eventX
这是 eventX 方法的代码:
def eventX(self, event):
if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab:
print 'CODE WINDOW: Tab pressed'
self.textEdit.insertPlainText(QString('| |'))
self.textEdit.update()
event.accept()
return True
elif event.type() == QEvent.KeyPress and (event.key() == Qt.Key_Enter) and event.modifiers() & Qt.ShiftModifier:
print 'CODE WINDOW: Shift pressed with Enter'
self.submitCode()
self.textEdit.update()
event.accept()
return True
else:
event.ignore()
return QWidget.event(self, event)
这就是事情变得奇怪的地方。如果我已经指定,上面的代码将会起作用:
verticalScrollBarPolicy = Qt.ScrollBarAsNeeded
对于 QTextEdit 小部件,除了它实际上不会显示小部件中的字符,但它似乎确实可以处理按下的 TAB 和 SHIFT-ENTER/SHIFT-RETURN 键?
然后,如果我设置 verticalScrollBarPolicy = Qt.ScrollBarAlwaysOn
,eventX 方法似乎会被完全忽略!
现阶段这让我发疯。有谁知道我做错了什么?
谢谢。
更新:根据来自 MDURANT 的信息,我现在拥有适用于我的以下代码:
def handleEditorKeyPress(self, event):
if event.key() == Qt.Key_Tab:
# My custom code goes here.
event.accept()
return
elif event.key() == Qt.Key_Enter and event.modifiers() & Qt.ShiftModifier:
# My custom code goes here.
event.accept()
return
elif event.key() == Qt.Key_Return and event.modifiers() & Qt.ShiftModifier:
# My custom code goes here.
event.accept()
return
else:
event.ignore()
return QTextEdit.keyPressEvent(self.textEdit, event)
捕获关键事件的例子。在这种情况下,我只是将事件传递给另一个相同的小部件,但通常,您可以将事件函数设置为任何值
class win(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self, parent=None)
self.box = QtGui.QHBoxLayout(self)
self.setLayout(self.box)
self.ed1 = QtGui.QTextEdit(self)
self.ed2 = QtGui.QTextEdit(self)
self.ed1.keyPressEvent = self.ed2.keyPressEvent
self.ed1.keyReleaseEvent = self.ed2.keyReleaseEvent
self.box.addWidget(self.ed1)
self.box.addWidget(self.ed2)
查看事件文档:http://qt-project.org/doc/qt-4.8/qtextedit.html#keyPressEvent
我在 Qt Designer 中开发了一个图形用户界面,其中显示了一个 QTextEdit 小部件。
我需要处理用户输入某些组合键(到目前为止,TAB 键、SHIFT + ENTER 和 SHIFT + RETURN),这样它就不会在 QTextEdit 小部件中显示这些字符并实现一些自定义功能。
我已经创建了一个处理程序来检测 keyReleaseEvents,但这似乎为时已晚,无法阻止显示制表符、回车 returns 等,所以我尝试处理 keyPressEvents,但这似乎根本不起作用。根据我在网上阅读的内容,人们说 keyPressEvent 正在被小部件消耗,因此永远不会传播到 gui。我对 QTextEdit 小部件的了解还不够多,无法判断这是否正确,但现在我假设它是正确的。
然后我在 gui 的 class __init__
方法中尝试了这个(我省略了对 RETURN 键的检查以使下面的代码简短:
self.textEdit.event = self.eventX
这是 eventX 方法的代码:
def eventX(self, event):
if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab:
print 'CODE WINDOW: Tab pressed'
self.textEdit.insertPlainText(QString('| |'))
self.textEdit.update()
event.accept()
return True
elif event.type() == QEvent.KeyPress and (event.key() == Qt.Key_Enter) and event.modifiers() & Qt.ShiftModifier:
print 'CODE WINDOW: Shift pressed with Enter'
self.submitCode()
self.textEdit.update()
event.accept()
return True
else:
event.ignore()
return QWidget.event(self, event)
这就是事情变得奇怪的地方。如果我已经指定,上面的代码将会起作用:
verticalScrollBarPolicy = Qt.ScrollBarAsNeeded
对于 QTextEdit 小部件,除了它实际上不会显示小部件中的字符,但它似乎确实可以处理按下的 TAB 和 SHIFT-ENTER/SHIFT-RETURN 键?
然后,如果我设置 verticalScrollBarPolicy = Qt.ScrollBarAlwaysOn
,eventX 方法似乎会被完全忽略!
现阶段这让我发疯。有谁知道我做错了什么?
谢谢。
更新:根据来自 MDURANT 的信息,我现在拥有适用于我的以下代码:
def handleEditorKeyPress(self, event):
if event.key() == Qt.Key_Tab:
# My custom code goes here.
event.accept()
return
elif event.key() == Qt.Key_Enter and event.modifiers() & Qt.ShiftModifier:
# My custom code goes here.
event.accept()
return
elif event.key() == Qt.Key_Return and event.modifiers() & Qt.ShiftModifier:
# My custom code goes here.
event.accept()
return
else:
event.ignore()
return QTextEdit.keyPressEvent(self.textEdit, event)
捕获关键事件的例子。在这种情况下,我只是将事件传递给另一个相同的小部件,但通常,您可以将事件函数设置为任何值
class win(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self, parent=None)
self.box = QtGui.QHBoxLayout(self)
self.setLayout(self.box)
self.ed1 = QtGui.QTextEdit(self)
self.ed2 = QtGui.QTextEdit(self)
self.ed1.keyPressEvent = self.ed2.keyPressEvent
self.ed1.keyReleaseEvent = self.ed2.keyReleaseEvent
self.box.addWidget(self.ed1)
self.box.addWidget(self.ed2)
查看事件文档:http://qt-project.org/doc/qt-4.8/qtextedit.html#keyPressEvent