检测“X”按钮何时被点击

3
我已经创建了一个登录窗口,在用户输入正确密码之前,该窗口将一直保留。如果用户按右上角的“X”按钮,窗口应该消失。但是,即使用户输入不正确的密码,窗口也会消失。
代码:
class Login(QDialog):
    def __init__(self,parent=None):
        super(Login, self).__init__(parent)

        self.grid = QGridLayout(self)
        self.setGeometry(650, 350, 400, 150)
        self.setFixedSize(400, 150)

        self.UserLabels = QLabel(self)
        self.UserLabels.setText('Login Number:')
        self.grid.addWidget(self.UserLabels, 0, 0, 1, 1)

        self.textName = QLineEdit(self)
        self.grid.addWidget(self.textName, 0, 1, 1, 2)

        self.buttonLogin = QPushButton('Submit', self)
        self.buttonLogin.clicked.connect(self.closeGUI)
        self.grid.addWidget(self.buttonLogin, 2, 0, 1, 3)

        finish = QAction("Quit", self)
        finish.triggered.connect(self.closeWin)

    def closeGUI(self):
        self.close()
        return str(self.textName.text())

    def closeWin(self):
        self.close()
        return 1

def handleLogin():
    flag = 0
    while flag == 0:
        edit_params__QD = Login()
        edit_params__QD.exec_()
        if edit_params__QD.result() == 0:
            password = edit_params__QD.closeGUI()
            if password == '6':
                flag = 1
            else:
                flag = 0
        if edit_params__QD.closeWin() == 1:
            flag = 1

if __name__ == '__main__':
    app = QApplication(sys.argv)
    handleLogin()

你可以按照 three_pineapples 在这里的回答处理事件: https://dev59.com/i2Af5IYBdhLWcg3wizOu#42969627 - sudobangbang
这两个都不能解决我的问题。我想要在输入不正确时窗口保持打开状态。但是,如果用户点击“X”,则销毁该窗口。目前,它只会销毁窗口。 - J. D.
2个回答

0

这里提供了一个更完整的示例,展示如何编写登录对话框:


然而,在您自己的示例中,您应该注意到不需要处理关闭事件,因为“X”按钮会自动将对话框的结果设置为{{link1:Rejected}}。相反,当单击提交按钮时,您只需要将结果设置为Accepted。然后,您可以检查exec_()的返回值以查看用户的操作。

以下是重写后的脚本:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class Login(QDialog):
    def __init__(self,parent=None):
        super(Login, self).__init__(parent)

        self.grid = QGridLayout(self)
        self.setGeometry(650, 350, 400, 150)
        self.setFixedSize(400, 150)

        self.UserLabels = QLabel(self)
        self.UserLabels.setText('Login Number:')
        self.grid.addWidget(self.UserLabels, 0, 0, 1, 1)

        self.textName = QLineEdit(self)
        self.grid.addWidget(self.textName, 0, 1, 1, 2)

        self.buttonLogin = QPushButton('Submit', self)
        self.buttonLogin.clicked.connect(self.accept)
        self.grid.addWidget(self.buttonLogin, 2, 0, 1, 3)

    def password(self):
        return self.textName.text()

def handleLogin():
    result = None
    login = Login()
    while result is None:
        if login.exec_() == QDialog.Accepted:
            password = login.password()
            if password == '6':
                result = True
        else:
            result = False
    return result

if __name__ == '__main__':
    app = QApplication(sys.argv)
    if handleLogin():
        print('logged in')
    else:
        print('cancelled')

还可以重写 exec_(),并使用 if super(Login, self).exec_(): return self.textName.text() 直接返回密码,这类似于 QInputDialog 静态方法的做法。 - musicamante
1
@musicamante 是的,我只是想解释一下 OP 的代码出了什么问题,并展示如何简化逻辑。我通常会编写一个登录对话框 类似于这个 - ekhumoro

0

试一下:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *


class MainWindow(QMainWindow):

    windowList = []                                          

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('Main interface')
        self.showMaximized()
        # Create Menu Bar
        self.createMenus()

    def createMenus(self):
        # Create login action
        self.printAction1 = QAction(self.tr("Entrance"), self)
        self.printAction1.triggered.connect(self.on_printAction1_triggered)
        # Create exit action
        self.printAction2 = QAction(self.tr("Exit"), self)
        self.printAction2.triggered.connect(self.on_printAction2_triggered)
        # Create menu, add actions
        self.printMenu = self.menuBar().addMenu(self.tr("Entrance and Exit"))
        self.printMenu.addAction(self.printAction1)
        self.printMenu.addAction(self.printAction2)

    # Step 1: Login
    def on_printAction1_triggered(self):
        self.close()
        dialog = LoginDialog()
        if  dialog.exec_()==QDialog.Accepted:
            the_window = MainWindow()
            self.windowList.append(the_window)          # ! It is important !
            the_window.show()

    def on_printAction2_triggered(self):
        self.close()

    # Interface close event
    def closeEvent(self, event):
        print("The End")


class LoginDialog(QDialog):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setWindowTitle('Login interface')
        self.resize(250, 200)
        self.setFixedSize(self.width(), self.height())
        self.setWindowFlags(Qt.WindowCloseButtonHint)

        # Configure UI controls
        self.frame = QFrame(self)
        self.frame.resize(250, 200)
        self.verticalLayout = QVBoxLayout(self.frame)

        self.lineEdit_account = QLineEdit()
        self.lineEdit_account.setPlaceholderText("Please enter nickName (admin)")
        self.verticalLayout.addWidget(self.lineEdit_account)

        self.lineEdit_password = QLineEdit()
        self.lineEdit_password.setPlaceholderText("Please enter your password (admin)")
        self.verticalLayout.addWidget(self.lineEdit_password)

        self.pushButton_enter = QPushButton()
        self.pushButton_enter.setText("OK")
        self.verticalLayout.addWidget(self.pushButton_enter)

        self.pushButton_quit = QPushButton()
        self.pushButton_quit.setText("Cancel")
        self.verticalLayout.addWidget(self.pushButton_quit)

        # bindings button Event
        self.pushButton_enter.clicked.connect(self.on_pushButton_enter_clicked)
        self.pushButton_quit.clicked.connect(QCoreApplication.instance().quit)

    def on_pushButton_enter_clicked(self):
        # Check nickName
        if self.lineEdit_account.text() != "admin":
            return

        # Check password
        if self.lineEdit_password.text() != "admin":
            return

        # Close the dialog and return 1 when checking
        self.accept()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    dialog = LoginDialog()

    if  dialog.exec_()==QDialog.Accepted:
        the_window = MainWindow()
        the_window.show()
        sys.exit(app.exec_())

enter image description here


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