如果对话框被拒绝,PyQt应用程序将冻结

时间:2014-07-22 15:36:10

标签: python pyqt pyqt5

我有一个小应用程序,需要在启动之前登录。 但是如果用户拒绝登录(按下取消按钮),应用程序就不会关闭,它只是冻结。

以下是简化代码:

import sys

from PyQt5 import QtWidgets, QtCore


class LoginWindow(QtWidgets.QDialog):

    def __init__(self, parent=None):
        super(LoginWindow, self).__init__(parent)
        self.resize(250, 150)
        self.move(500, 500)
        self.setWindowTitle('Login')
        self.login_input = QtWidgets.QLineEdit(self)
        self.login_input.move(10, 10)
        self.password_input = QtWidgets.QLineEdit(self)
        self.password_input.move(10, 50)
        self.password_input.setEchoMode(QtWidgets.QLineEdit.Password)
        self.button_box = QtWidgets.QDialogButtonBox(self)
        self.button_box.move(10, 80)
        self.button_box.setOrientation(QtCore.Qt.Horizontal)
        self.button_box.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel |
                                           QtWidgets.QDialogButtonBox.Ok)

        self.button_box.accepted.connect(self.login)
        self.button_box.rejected.connect(self.reject)

    def login(self):
        self.accept()

    def cancel(self):
        self.reject()


class MainWindow(QtWidgets.QDialog):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(250, 150)
        self.move(500, 500)
        self.setWindowTitle('Main')
        self.input = QtWidgets.QLineEdit(self)
        self.input.move(10, 10)
        self.show()

def main():
    app = QtWidgets.QApplication([])
    l = LoginWindow()
    l.show()
    login_result = l.exec_()
    print(login_result)
    if login_result == QtWidgets.QDialog.Accepted:
        m = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

我做错了什么? 我使用python 3和PyQt5

2 个答案:

答案 0 :(得分:2)

这是因为PySide没有处理任何事件。

app.exec_()

这将启动主事件循环,该循环不断处理每个GUI交互。应该在执行任何GUI代码之前调用它,以便可以从事件队列中正确处理事件。

QDialog.exec_()是一种阻止操作,阻止代码继续响应。

如果你想看到对话框项目,那么你可以解决这个问题。

QtGui.QApplication.processEvents()

这将处理事件队列中的所有事件,因此您可能必须继续调用此方法。

初始化主窗口后,您还必须显示主窗口。

答案 1 :(得分:1)

我找到了避免这个错误的方法:

我改变了主要功能:

def main():
    app = QtWidgets.QApplication([])
    if LoginWindow().exec_() == QtWidgets.QDialog.Accepted:
        m = MainWindow()
        sys.exit(app.exec_())

它运作正常,但仍然无法理解,问题的根本原因是什么