我有一个小应用程序,需要在启动之前登录。 但是如果用户拒绝登录(按下取消按钮),应用程序就不会关闭,它只是冻结。
以下是简化代码:
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
答案 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_())
它运作正常,但仍然无法理解,问题的根本原因是什么