2014-07-22 32 views
0

我有一个小应用程序,需要登录才开始。 但是,如果用户拒绝登录(按取消按钮),应用程序不会关闭,它只是冻结。PyQt应用程序冻结,如果对话框被拒绝

下面是简化代码:

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

发生这种情况是因为PySide没有处理它的任何事件。

app.exec_() 

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

QDialog.exec_()是一种阻止操作,阻止代码继续执行,直至获得响应。

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

QtGui.QApplication.processEvents() 

这种处理所有在事件队列中的事件,所以你可能将不得不继续调用此方法。

此外,在初始化主窗口后,您将不得不显示主窗口。

0

我找到一个方法来避免这个错误:

我已经改变了主要功能:

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

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