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

时间:2019-08-28 19:11:55

标签: python pyqt pyqt5 qtextedit

我正在使用PyQt5在Python上为客户端编写Chat gui。 我有一个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')

3 个答案:

答案 0 :(得分:2)

当重写keyPressEvent时,您正在侦听窗口的事件,而是将eventFilter安装到QTextEdit,而不是像在代码中那样安装到窗口,并检查作为参数传递的对象是否是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)

答案 1 :(得分:0)

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

如果您可以摆脱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方法。

答案 2 :(得分:-1)

当您覆盖 keyPressEvent 时,您正在侦听窗口的事件,而是将 eventFilter 安装到 QTextEdit,而不是像您在代码中所做的那样安装到窗口,并检查作为参数传递的对象是否是 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 面临的问题。将正确的返回值添加到 eventFilter 可以解决问题。