当连接的插槽显示QMessageBox时,为什么editFinished信号会生成两次?

时间:2019-11-09 20:36:20

标签: python pyside2

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_())

因此,在此脚本中,如果在编辑“ lineEdit”时按“ Enter”,则“ check”插槽将被调用两次。但是,如果您单击“ lineEdit2”,则该插槽将仅被调用一次。发生这种情况是由于QMessageBox,但是为什么?

1 个答案:

答案 0 :(得分:1)

如果您选中the docs

  

void QLineEdit::editingFinished()

     

当按下Return或Enter键或   行编辑失去焦点。请注意,如果有一个validator()或   在行编辑中设置inputMask()并按Enter / Return键,   仅当输入遵循以下命令时才会发出editingFinished()信号   inputMask()和Validator()返回QValidator :: Acceptable。

(重点是我的)

在您的情况下,当您按 Enter 时,将显示第一张打印纸;当QLineEdit自QMessageBox获得焦点后失去焦点时,将显示第二张打印纸。