处理QTextEdit事件的问题()

时间:2015-02-26 16:10:22

标签: python qt pyqt

我在Qt Designer中开发了一个gui,其中包括显示QTextEdit小部件。

我需要处理用户输入特定组合键(TAB键,SHIFT + ENTER和SHIFT + RETURN到目前为止),使其不在QTextEdit小部件中显示这些字符并实现一些自定义功能。

我已经创建了一个检测 keyReleaseEvent 的处理程序,但这似乎为时已晚,无法阻止标签,回车等显示,所以我尝试处理 keyPressEvent s,但这似乎根本不起作用。从我在网上看到的,人们都说 keyPressEvent 正在被小部件消耗掉,因此永远不会传播到gui。我不太了解QTextEdit小部件,如果这是正确的,但现在我假设它是。

然后我在gui的类__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)

1 个答案:

答案 0 :(得分:1)

捕获关键事件的示例。在这种情况下,我只是将事件传递给另一个相同的小部件,但通常,您可以将事件函数设置为任何内容

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