我怎么知道什么时候在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')

当你重写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)

如果您决定使用 QTextEdit,@eyllanesc的答案非常好。

如果你能摆脱QLineEdit及其限制,你可以使用returnPressed((信号。QLineEdit的最大缺点是你被限制在一行文本上。而且没有自动换行。但优点是你不必弄乱事件过滤器,也不必过多地考虑按键信号如何通过你应用中的所有小部件。

下面是一个从一个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时,你正在侦听窗口的事件,而是将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之上的。将正确的返回值添加到eventFilter可以解决此问题。

最新更新