2012-08-04 63 views
8

當客戶問我是否可以在應用程序啓動時實現某種登錄表單時,我幾乎完成了我的應用程序。登錄對話框PyQt

到目前爲止,我設計了用戶界面,並對實際執行進行了修飾。用戶名和密碼現在不相關。

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

順便說一句,'QtCore.QObject.connect(self.ui2.buttonLogin,QtCore.SIGNAL( 「點擊()」),self.doLogin)'可以用'自取代.ui2.buttonLogin.clicked.connect(self.doLogin)' – warvariuc 2012-08-05 06:55:01

回答

23

A 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

謝謝你的回覆,它的工作原理。如果我想檢查,讓我們說兩個變量等於某件事情,如果他們這樣做,然後發出一個信號? if name ==「john」and passw ==「doe」: self.emit(有些東西在這裏) – ivica 2012-08-05 00:40:36

+1

這個例子創建了一個臨時對話框,這個對話框會被扔掉,所以你不能檢查更多的值。你可能想要做login = Login(); login.exec_()並檢查接受的返回。然後您可以繼續檢查登錄對象的屬性。 – jdi 2012-08-05 06:17:13

+0

嗯,我們到了某個地方:) 我已經用新代碼編輯了原始文章,以便它可以更清晰地閱讀。 – ivica 2012-08-05 10:21:18