使用keyPressEvent来捕获回车或返回

时间:2013-12-06 09:13:48

标签: python pyqt pyside key-events

我有一个简单的表单,包含一些组合,标签,按钮和QTextEdit。

我尝试用keyPressEvent捕获enter或return键,但由于某种原因我无法做到。 然而,我也使用的ESC键被识别。

这是一段代码:

 def keyPressEvent(self, e):
    print e.key()
    if e.key() == QtCore.Qt.Key_Return:
        self.created.setText('return')
    if e.key() == QtCore.Qt.Key_Enter:
        self.created.setText('enter')
    if e.key() == QtCore.Qt.Key_Escape:
        self.cmbEdit = not(self.cmbEdit)
        if self.cmbEdit:

等...

我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

您的代码并不完全清楚,但看起来您可能已为表单重新实现keyPressEvent,当您需要为文本编辑本身执行此操作时。

解决这个问题的一种方法是使用event filter,它有时可以更灵活,因为它可以避免对您感兴趣的小部件进行子类化。下面的演示脚本显示了基础知识如何使用它。需要注意的重要一点是,事件过滤器应返回True以停止任何进一步处理,返回False以传递事件以进行进一步处理,或者只是直接进入基类事件过滤器。

from PySide import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.edit = QtGui.QTextEdit(self)
        self.edit.installEventFilter(self)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.edit)

    def eventFilter(self, widget, event):
        if (event.type() == QtCore.QEvent.KeyPress and
            widget is self.edit):
            key = event.key()
            if key == QtCore.Qt.Key_Escape:
                print('escape')
            else:
                if key == QtCore.Qt.Key_Return:
                    self.edit.setText('return')
                elif key == QtCore.Qt.Key_Enter:
                    self.edit.setText('enter')
                return True
        return QtGui.QWidget.eventFilter(self, widget, event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 300, 300)
    window.show()
    sys.exit(app.exec_())