登录对话框 PyQt

16

我的应用程序快要完成了,顾客却要求我在应用程序启动时实现一种登录表单。

到目前为止,我已经设计好了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_())

登录表单已显示。如果输入正确的用户名和密码,则会显示主窗口并正常工作。但是,登录表单仍然处于活动状态,如果我关闭它,主窗口也会关闭。


4
顺便说一下,QtCore.QObject.connect(self.ui2.buttonLogin, QtCore.SIGNAL("clicked()"), self.doLogin) 可以替换为 self.ui2.buttonLogin.clicked.connect(self.doLogin) - warvariuc
1个回答

46

QDialog有自己的事件循环,因此它可以与主应用程序分开运行。

您只需要检查对话框的返回代码,以决定是否应该运行主应用程序。

示例代码(PyQt5):

from PyQt5 import QtWidgets
# from mainwindow import Ui_MainWindow

class Login(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Login, self).__init__(parent)
        self.textName = QtWidgets.QLineEdit(self)
        self.textPass = QtWidgets.QLineEdit(self)
        self.buttonLogin = QtWidgets.QPushButton('Login', self)
        self.buttonLogin.clicked.connect(self.handleLogin)
        layout = QtWidgets.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:
            QtWidgets.QMessageBox.warning(
                self, 'Error', 'Bad user or password')

class Window(QtWidgets.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 = QtWidgets.QApplication(sys.argv)
    login = Login()

    if login.exec_() == QtWidgets.QDialog.Accepted:
        window = Window()
        window.show()
        sys.exit(app.exec_())

示例代码(PyQt4):

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

谢谢您的回复,它有效。如果我想检查两个变量是否等于某些值,如果是,则发出信号,该怎么办?如果 name == "john" and passw == "doe": self.emit(这里放置信号) - ivica
1
这个例子创建了一个临时对话框,它会被丢弃,所以你无法检查更多的值。你可能想要执行 login = Login(); login.exec_() 并检查返回值是否为 accepted。然后你可以继续检查登录对象上的属性。 - jdi
嗯,我们取得了一些进展 :)我已经使用新代码编辑了原始帖子,以便它可以更清晰地阅读。 - ivica
1
@ivica。我已经更新了我的答案,并提供了一个更完整的示例。请注意,我的“登录”类可以完全独立于其使用的应用程序工作,从而实现代码重用。 - ekhumoro
我终于搞定了。我的代码有很多错误,主要是“父子”相关的。如果没有 Stack Overflow,我该怎么办呢? :)谢谢您。 - ivica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接