2012-08-04 162 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