簡體   English   中英

我如何知道 QTextEdit 上的 Enter 鍵何時被按下

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM