我正在使用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')
答案 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
可以解决问题。