2012-08-04 19 views
8

アプリケーションの起動時に何らかの種類のログインフォームを実装できるかどうか尋ねられたときに、私はほとんどアプリケーションを終了しました。ログインダイアログPyQt

これまでのところ、私はUIを設計し、実際の実行については触れませんでした。ユーザー名とパスワードは今のところ無関係です。

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

答えて

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

あなたの返事をありがとう、それは働いています。もし私がチェックしたいのであれば、2つの変数が何かと等しいと言うことができます、そして、もしそうなら、シグナルを出しますか? if name == "john" and passw == "doe": self.emit(何かがここにあります) – ivica

+1

この例では、より多くの値を確認できないように破棄される一時ダイアログを作成します。おそらくlogin = Login();を実行したいと思うでしょう。 login.exec_()そして受け入れられたことの戻り値を確認します。次に、ログインオブジェクトの属性を確認し続けることができます。 – jdi

+0

さて、私たちはどこかに行った:) 私は新しいコードで元の投稿を編集しているので、より明確に読むことができます。 @vica。 – ivica