Diálogo de inicio de sesión PyQt

Casi terminé mi solicitud, cuando el cliente me preguntó si podía implementar algún tipo de formulario de inicio de sesión en el inicio de la aplicación.

Hasta ahora he diseñado la interfaz de usuario y he pensado en la ejecución real. El nombre de usuario y la contraseña son irrelevantes por ahora.

class Login(QtGui.QDialog): def __init__(self,parent=None): QtGui.QWidget.__init__(self,parent) self.ui=Ui_dlgLogovanje() self.ui.setupUi(self) QtCore.QObject.connect(self.ui.buttonLogin, QtCore.SIGNAL("clicked()"), self.doLogin) def doLogin(self): name = str(self.ui.lineKorisnik.text()) passwd = str(self.ui.lineSifra.text()) if name == "john" and passwd =="doe": self.runIt() else: QtGui.QMessageBox.warning(self, 'Greška', "Bad user or password", QtGui.QMessageBox.Ok) def runIt(self): myprogram = Window() myprogram.showMaximized() #myprogram is class Window(QtGui.QMainWindow): def __init__(self,parent=None): QtGui.QWidget.__init__(self,parent) self.ui=Ui_MainWindow() self.ui.setupUi(self) if __name__=="__main__": program = QtGui.QApplication(sys.argv) myprogram = Window() if Login().exec_() == QtGui.QDialog.Accepted: sys.exit(program.exec_()) 

Se muestra el formulario de inicio de sesión. Si se ingresan el nombre de usuario y la contraseña correctos, entonces la ventana principal se muestra y funciona. Pero, el formulario de inicio de sesión permanece activo, y si lo cierro, la ventana principal también se cerrará.

Un QDialog tiene su propio bucle de eventos, por lo que puede ejecutarse por separado de la aplicación principal.

Por lo tanto, solo necesita verificar el código de retorno del cuadro de diálogo para decidir si la aplicación principal debe ejecutarse o no.

Código de ejemplo (PyQt4):

 from PyQt4 import QtGui # from mainwindow import Ui_MainWindow class Login(QtGui.QDialog): def __init__(self, parent=None): super(Login, self).__init__(parent) self.textName = QtGui.QLineEdit(self) self.textPass = QtGui.QLineEdit(self) self.buttonLogin = QtGui.QPushButton('Login', self) self.buttonLogin.clicked.connect(self.handleLogin) layout = QtGui.QVBoxLayout(self) layout.addWidget(self.textName) layout.addWidget(self.textPass) layout.addWidget(self.buttonLogin) def handleLogin(self): if (self.textName.text() == 'foo' and self.textPass.text() == 'bar'): self.accept() else: QtGui.QMessageBox.warning( self, 'Error', 'Bad user or password') class Window(QtGui.QMainWindow): def __init__(self, parent=None): super(Window, self).__init__(parent) # self.ui = Ui_MainWindow() # self.ui.setupUi(self) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) login = Login() if login.exec_() == QtGui.QDialog.Accepted: window = Window() window.show() sys.exit(app.exec_()) 

Código de ejemplo (PyQt5):

 from PyQt5 import QtWidgets # from mainwindow import Ui_MainWindow class Login(QtWidgets.QDialog): def __init__(self, parent=None): super(Login, self).__init__(parent) self.textName = QtWidgets.QLineEdit(self) self.textPass = QtWidgets.QLineEdit(self) self.buttonLogin = QtWidgets.QPushButton('Login', self) self.buttonLogin.clicked.connect(self.handleLogin) layout = QtWidgets.QVBoxLayout(self) layout.addWidget(self.textName) layout.addWidget(self.textPass) layout.addWidget(self.buttonLogin) def handleLogin(self): if (self.textName.text() == 'foo' and self.textPass.text() == 'bar'): self.accept() else: QtWidgets.QMessageBox.warning( self, 'Error', 'Bad user or password') class Window(QtWidgets.QMainWindow): def __init__(self, parent=None): super(Window, self).__init__(parent) # self.ui = Ui_MainWindow() # self.ui.setupUi(self) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) login = Login() if login.exec_() == QtWidgets.QDialog.Accepted: window = Window() window.show() sys.exit(app.exec_())