[英]How can I know when the Enter key was pressed on 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 的最大缺點是您只能使用一行文本。 而且沒有自動換行。 但優點是您不必弄亂 eventFilters 或過多考慮 keyPress 信號如何穿過應用程序中的所有小部件。
這是從一個 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 Segal 面臨的問題的基礎上的。 將正確的返回值添加到eventFilter
可以解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.