2012-08-04 16 views
8

Ho quasi finito la mia domanda, quando il cliente mi ha chiesto se potevo implementare un qualche tipo di modulo di accesso all'avvio dell'applicazione.Finestra di dialogo di login PyQt

Finora ho progettato l'interfaccia utente e ho lavorato sull'esecuzione effettiva. Username e password sono irrilevanti per ora.

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

Il modulo di accesso è mostrato. Se si inseriscono nome utente e password corretti, viene mostrata e funzionante la finestra principale. Ma il modulo di login rimane attivo e se lo chiudo, si chiuderà anche la finestra principale.

+3

btw, 'QtCore.QObject.connect (self.ui2.buttonLogin, QtCore.SIGNAL ("cliccato()"), self.doLogin)' può essere sostituito con 'auto .ui2.buttonLogin.clicked.connect (self.doLogin) ' – warvariuc

risposta

23

A QDialog ha un proprio ciclo di eventi, quindi può essere eseguito separatamente dall'applicazione principale.

Quindi è sufficiente controllare il codice di ritorno della finestra di dialogo per decidere se l'applicazione principale deve essere eseguita o meno.

codice

Esempio:

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

Grazie per la risposta, funziona. Che se volessi controllare, diciamo che due variabili equivalgono a qualcosa, e se lo fanno, emettono un segnale? se nome == "john" e passw == "doe": self.emit (qualcosa va qui) – ivica

+1

Questo esempio crea una finestra di dialogo temporanea che viene gettata via in modo da non poter controllare più valori. Probabilmente vuoi fare login = Login(); login.exec_() E controlla il ritorno di quello per accettato. E quindi puoi continuare a controllare gli attributi sull'oggetto di accesso. – jdi

+0

Beh, siamo arrivati ​​da qualche parte :) Ho modificato la pubblicazione originale con un nuovo codice, in modo che possa essere letto più chiaramente. – ivica

Problemi correlati