2012-08-04 14 views
8

Casi terminé mi aplicación, 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.Diálogo de inicio de sesión PyQt

Hasta ahora he diseñado la interfaz de usuario y he reparado 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, se muestra la ventana principal y funciona. Pero, el formulario de inicio de sesión permanece activo, y si lo cierro, la ventana principal también se cerrará.

+3

por cierto, 'QtCore.QObject.connect (self.ui2.buttonLogin, QtCore.SIGNAL ("hace clic()"), self.doLogin)' puede ser reemplazado con 'auto .ui2.buttonLogin.clicked.connect (self.doLogin) ' – warvariuc

Respuesta

23

A QDialog tiene su propio bucle de eventos, por lo que se puede ejecutar por separado desde la aplicación principal.

Así que solo necesita comprobar el código de retorno del diálogo para decidir si la aplicación principal debe ejecutarse o no.

código

Ejemplo:

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

Gracias por su respuesta, funciona. ¿Y si quisiera verificar, digamos que dos variables son iguales a algo, y si lo hacen, entonces emitir una señal? if name == "john" and passw == "doe": self.emit (algo vale aquí) – ivica

+1

Este ejemplo crea un cuadro de diálogo temporal que se descarta, por lo que no puede verificar más valores. Probablemente quiera hacer login = Login(); login.exec_() Y verifique la devolución de eso para aceptado. Y luego puede continuar verificando los atributos en el objeto de inicio de sesión. – jdi

+0

Bueno, tenemos un lugar :) He editado la publicación original con un nuevo código, para que pueda leerse con más claridad. – ivica

Cuestiones relacionadas