处理QTextEdit事件()时出现问题

2024-09-28 23:01:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我需要以这样一种方式处理用户输入特定的组合键(TAB键、SHIFT+ENTER和SHIFT+RETURN)的方式来处理用户输入的某些组合键,这样它就不会在QTextEdit小部件中显示这些字符,并实现一些自定义功能。在

我已经创建了一个处理程序来检测keyReleaseEvents,但这似乎太迟了,无法阻止制表符、回车符等显示,所以我尝试处理keypresevents,但似乎根本不起作用。从我在网上读到的,人们说keyPressEvent正在被widget消费,因此永远不会传播到gui上。我对qtexteditwidgets知之甚少,无法判断这是否正确,但目前我认为它是正确的。在

因此,我在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)


Tags: and方法key代码selfeventreturnshift
1条回答
网友
1楼 · 发布于 2024-09-28 23:01:20

捕获关键事件的示例。在本例中,我只需将事件传递给另一个相同的小部件,但通常,您可以将事件函数设置为任何值

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

相关问题 更多 >