2012-08-04 23 views
8

मैंने लगभग अपना आवेदन पूरा कर लिया, जब ग्राहक ने पूछा कि क्या मैं एप्लिकेशन स्टार्टअप पर किसी प्रकार का लॉगिन फॉर्म लागू कर सकता हूं।लॉगिन संवाद PyQt

अब तक मैंने UI को डिज़ाइन किया है, और वास्तविक निष्पादन के बारे में tinkered है। उपयोगकर्ता नाम और पासवर्ड अब के लिए अप्रासंगिक हैं।

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

लॉगिन फॉर्म दिखाया गया है। यदि सही उपयोगकर्ता नाम और पासवर्ड दर्ज किया गया है, तो मुख्य विंडो दिखायी जाती है और काम कर रही है। लेकिन, लॉगिन फॉर्म सक्रिय रहता है, और अगर मैं इसे बंद करता हूं, तो मुख्य विंडो भी बंद हो जाएगी।

+3

btw, 'QtCore.QObject.connect (self.ui2.buttonLogin, QtCore.SIGNAL (" क्लिक() "), self.doLogin)' 'स्वयं के साथ बदला जा सकता है .ui2.buttonLogin.clicked.connect (self.doLogin) ' – warvariuc

उत्तर

23

QDialog का अपना इवेंट लूप है, इसलिए इसे मुख्य एप्लिकेशन से अलग से चलाया जा सकता है।

तो आपको यह तय करने के लिए संवाद का रिटर्न कोड जांचना होगा कि मुख्य आवेदन चलाना चाहिए या नहीं।

उदाहरण कोड:

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

आपके उत्तर के लिए धन्यवाद, यह काम करता है। अगर मैं जांचना चाहता था, तो कहें कि दो चर कुछ के बराबर हैं, और यदि वे करते हैं, तो सिग्नल छोड़ दें? यदि नाम == "जॉन" और पासव == "डो": self.emit (कुछ यहां जाता है) – ivica

+1

यह उदाहरण एक अस्थायी संवाद बनाता है जो फेंक दिया जाता है ताकि आप अधिक मूल्यों की जांच न कर सकें। आप शायद लॉगिन करना चाहते हैं = लॉगिन(); login.exec_() और स्वीकार किए जाने के लिए उसकी वापसी की जांच करें। और फिर आप लॉगिन ऑब्जेक्ट पर विशेषताओं की जांच जारी रख सकते हैं। – jdi

+0

ठीक है, हमें कहीं मिला है :) मैंने मूल पोस्टिंग को नए कोड के साथ संपादित किया है, ताकि इसे और अधिक स्पष्ट रूप से पढ़ा जा सके। – ivica