Почему сигнал editFinished генерируется два раза, когда QMessageBox показывается подключенным слотом? - PullRequest
1 голос
/ 09 ноября 2019
from PySide2 import QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.lineEdit = QtWidgets.QLineEdit()
        self.lineEdit.setText("1")
        self.lineEdit.editingFinished.connect(self.check)
        self.lineEdit2 = QtWidgets.QLineEdit()
        vlay = QtWidgets.QVBoxLayout(self)
        vlay.addWidget(self.lineEdit)
        vlay.addWidget(self.lineEdit2)

    def check(self):
        if self.lineEdit.text() == "1":
            popup = QtWidgets.QMessageBox(self)
            popup.setWindowTitle("why")
            popup.show()
            print("test")


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

Таким образом, в этом скрипте, если вы нажимаете «Enter» во время редактирования «lineEdit», слот «check» вызывается два раза. Но если вы нажмете «lineEdit2», слот будет вызываться только один раз, как и должно быть. Это происходит из-за QMessageBox, но почему?

1 Ответ

1 голос
/ 09 ноября 2019

Если вы отметите документы :

void QLineEdit :: editFinished ()

Этот сигнал испускается, когда нажата клавиша возврата или ввода или редактирование строки теряет фокус . Обратите внимание, что если для редактирования строки заданы валидатор () или inputMask () и нажата кнопка ввода / возврата, сигнал editFinished () будет излучаться только в том случае, если вход следует за inputMask () и валидатор () возвращает QValidator:: Приемлемо.

(выделено мной)

В вашем случае первый отпечаток выдается при нажатии Enter , а второй -дается, когда QLineEdit теряет фокус, поскольку QMessageBox получает его.

...