我怎么知道什么时候在 QTextEdit 上按下 Enter 键

How can I know when the Enter key was pressed on QTextEdit

我正在使用 PyQt5 为 Python 上的客户端编写聊天图形用户界面。 我有一个 QTextEdit,客户端可以在其中写入消息。 当焦点在 QTextEdit 上时,我不想知道何时按下 'Enter' 键。

我尝试使用 installEventFilter 函数,但它检测到在除 QTextEdit 之外的所有其他小部件上按下的键。 我该怎么做才能解决这个问题?

def initUI(self):
   # ...
    self.text_box = QtWidgets.QTextEdit(self)
    self.installEventFilter(self)
    # ...

def keyPressEvent(self, qKeyEvent):
    print(qKeyEvent.key())
    if qKeyEvent.key() == Qt.Key_Return:
        if self.text_box.hasFocus():
            print('Enter pressed')

当您重写 keyPressEvent 时,您正在监听 window 的事件,而不是像您在代码中所做的那样将 eventFilter 安装到 QTextEdit,而不是 window,并检查是否作为参数传递的对象是 QTextEdit:

def initUI(self):
    # ...
    self.text_box = QtWidgets.QTextEdit(self)
    self.text_box.installEventFilter(self)
    # ...

def eventFilter(self, obj, event):
    if event.type() == QtCore.QEvent.KeyPress and obj is self.text_box:
        if event.key() == QtCore.Qt.Key_Return and self.text_box.hasFocus():
            print('Enter pressed')
    return super().eventFilter(obj, event)

@eyllanesc 的回答非常好,如果你确定要使用 QTextEdit。

如果您可以避开 QLineEdit 及其限制,则可以使用 returnPressed() 信号。 QLineEdit 的最大缺点是您只能使用一行文本。而且没有自动换行。但优点是您不必弄乱 eventFilters,也不必过多考虑 keyPress 信号如何通过应用程序中的所有小部件。

这是一个从一个 QLineEdit 复制到另一个 QLineEdit 的最小示例:

import sys

from PyQt5.QtWidgets import * 


class PrintWindow(QMainWindow):

    def __init__(self):
        super().__init__()
        self.left=50
        self.top=50
        self.width=300
        self.height=300
        self.initUI()

    def initUI(self):

        self.setGeometry(self.left,self.top,self.width,self.height)

        self.line_edit1 = QLineEdit(self)
        self.line_edit1.move(50, 50)
        self.line_edit1.returnPressed.connect(self.on_line_edit1_returnPressed)

        self.line_edit2 = QLineEdit(self)
        self.line_edit2.move(50, 100)

        self.show()

    def on_line_edit1_returnPressed(self):
        self.line_edit2.setText(self.line_edit1.text())

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = PrintWindow()
    sys.exit(app.exec_())

在此示例中,我已手动连接到第 22 行 (self.line_edit1.returnPressed.connect) 中的信号。如果您使用的是 ui 文件,则可以忽略此连接,您的程序将自动调用 on__returnPressed 方法。

当您重写 keyPressEvent 时,您正在监听 window 的事件,而不是像您在代码中所做的那样将 eventFilter 安装到 QTextEdit,而不是 window,并检查是否作为参数传递的对象是 QTextEdit:

def initUI(self):
    # ...
    self.text_box = QtWidgets.QTextEdit(self)
    self.text_box.installEventFilter(self)
    # ...

def eventFilter(self, obj, event):
    if event.type() == QtCore.QEvent.KeyPress and obj is self.text_box:
        if event.key() == QtCore.Qt.Key_Return and self.text_box.hasFocus():
            print('Enter pressed')
            return True
    return False

这是建立在@eyllanesc 的回答和@Daniel Segal 面临的问题的基础上的。将正确的 return 值本身添加到 eventFilter 即可解决问题。