华夏意匠289 2025-07-13 10:46 采纳率: 0%
浏览 11

关于#qt#的问题:qt完成登录窗口的制作,错误的密码情况下,给用户三次登录机会,如果输入错误超过三次,锁定账号并跨天解锁(相关搜索:定时器)

qt完成登录窗口的制作,错误的密码情况下,给用户三次登录机会,如果输入错误超过三次,锁定账号并跨天解锁; 如果用户勾选了“记住用户和密码”,需要记录用户名和密码,下次自动填充并登录;口令的回显——定时器,完整步骤

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-07-13 10:47
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    在Qt中实现一个带有登录功能的窗口,包括**错误密码尝试次数限制、账号锁定、记住用户和密码、口令回显(定时器)**等功能,是一个较为完整的项目。以下是详细的实现步骤:


    一、项目结构

    1. 主窗口类:LoginWindow
      • 包含用户名输入框、密码输入框、记住我复选框、登录按钮、提示信息标签。
    2. 数据存储方式:使用QSettings保存用户信息(可选文件存储)
    3. 逻辑控制:使用QTimer实现口令回显

    二、核心功能说明

    1. 错误密码尝试次数限制

    • 用户每次输入错误密码时,计数器加1。
    • 如果超过3次,锁定账户,并显示“账号已锁定”提示。
    • 锁定后,需等待一天后才能再次尝试。

    重点:锁定机制需要记录锁定时间,并在下次启动时判断是否解锁。

    2. 记住用户和密码功能

    • 使用QSettings将用户名和密码保存到本地。
    • 如果勾选了“记住我”,则在下次启动时自动填充用户名和密码。
    • 自动登录功能:如果用户名和密码都存在且正确,则自动登录。

    3. 口令回显(定时器)

    • 使用QTimer每隔一段时间(如0.5秒)更新密码框中的内容。
    • 每次更新时,将密码字符替换为星号(*)或其它符号。

    三、完整实现步骤(代码示例)

    1. 创建项目

    • 打开Qt Creator,创建一个新的Qt Widgets Application项目。
    • 名称:LoginApp
    • 基类选择 QMainWindowQDialog

    2. 设计UI界面(loginwindow.ui

    | 控件类型 | 对象名 | 功能描述 | |----------------|----------------|------------------------| | QLineEdit | usernameEdit | 用户名输入框 | | QLineEdit | passwordEdit | 密码输入框 | | QCheckBox | rememberBox | 记住我复选框 | | QPushButton | loginButton | 登录按钮 | | QLabel | statusLabel | 状态提示信息 |


    3. 编写 loginwindow.h

    #ifndef LOGINWINDOW_H
    #define LOGINWINDOW_H
    
    #include <QDialog>
    #include <QTimer>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class LoginWindow; }
    QT_END_NAMESPACE
    
    class LoginWindow : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit LoginWindow(QWidget *parent = nullptr);
        ~LoginWindow();
    
    private slots:
        void on_loginButton_clicked();
        void on_timerTimeout(); // 定时器槽函数
    
    private:
        Ui::LoginWindow *ui;
        int attemptCount; // 尝试次数
        QTimer *timer; // 口令回显定时器
        bool isLocked; // 是否被锁定
    };
    
    #endif // LOGINWINDOW_H
    

    4. 编写 loginwindow.cpp

    #include "loginwindow.h"
    #include "ui_loginwindow.h"
    #include <QSettings>
    #include <QDateTime>
    #include <QDebug>
    
    LoginWindow::LoginWindow(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::LoginWindow),
        attemptCount(0),
        isLocked(false)
    {
        ui->setupUi(this);
    
        // 初始化设置
        QSettings settings("MyApp", "LoginApp");
        QString savedUser = settings.value("username").toString();
        QString savedPass = settings.value("password").toString();
        bool remember = settings.value("remember").toBool();
    
        if (remember && !savedUser.isEmpty() && !savedPass.isEmpty()) {
            ui->usernameEdit->setText(savedUser);
            ui->passwordEdit->setText(savedPass);
            // 自动登录
            on_loginButton_clicked();
        }
    
        // 设置定时器
        timer = new QTimer(this);
        connect(timer, &QTimer::timeout, this, &LoginWindow::on_timerTimeout);
        timer->start(500); // 每0.5秒更新一次
    }
    
    LoginWindow::~LoginWindow()
    {
        delete ui;
    }
    
    void LoginWindow::on_loginButton_clicked()
    {
        QString username = ui->usernameEdit->text();
        QString password = ui->passwordEdit->text();
    
        // 检查是否被锁定
        if (isLocked) {
            ui->statusLabel->setText("账号已被锁定,请明天再试!");
            return;
        }
    
        // 预设正确的用户名和密码
        QString correctUser = "admin";
        QString correctPass = "123456";
    
        if (username == correctUser && password == correctPass) {
            ui->statusLabel->setText("登录成功!");
            close();
        } else {
            attemptCount++;
            ui->statusLabel->setText(QString("错误!剩余尝试次数:%1").arg(3 - attemptCount));
    
            if (attemptCount >= 3) {
                isLocked = true;
                QDateTime now = QDateTime::currentDateTime();
                QDateTime lockTime = now.addDays(1); // 一天后解锁
                qDebug() << "Account locked until:" << lockTime.toString();
    
                // 保存锁定状态
                QSettings settings("MyApp", "LoginApp");
                settings.setValue("lockTime", lockTime.toSecsSinceEpoch());
    
                ui->statusLabel->setText("账号已被锁定,请明天再试!");
            }
        }
    
        // 记住用户和密码
        if (ui->rememberBox->isChecked()) {
            QSettings settings("MyApp", "LoginApp");
            settings.setValue("username", username);
            settings.setValue("password", password);
            settings.setValue("remember", true);
        } else {
            QSettings settings("MyApp", "LoginApp");
            settings.remove("username");
            settings.remove("password");
            settings.remove("remember");
        }
    }
    
    void LoginWindow::on_timerTimeout()
    {
        QString currentText = ui->passwordEdit->text();
        if (!currentText.isEmpty()) {
            QString maskedText;
            for (int i = 0; i < currentText.length(); ++i) {
                maskedText += "*";
            }
            ui->passwordEdit->setText(maskedText);
        }
    }
    

    四、关键逻辑总结

    1. 锁定机制

      • 使用QSettings保存锁定时间。
      • 每次启动程序时检查当前时间是否大于锁定时间。
    2. 记住用户和密码

      • 使用QSettings保存用户名和密码。
      • 自动登录逻辑:如果存在且正确,直接登录。
    3. 口令回显

      • 使用QTimer每隔0.5秒更新密码框内容。
      • 将输入内容替换为*

    五、扩展建议

    | 功能点 | 实现方式 | |----------------|----------------------------------| | 账号锁定验证 | 在程序启动时读取lockTime并比较 | | 多用户支持 | 使用数据库或文件存储多个用户信息 | | 加密存储密码 | 使用QCryptographicHash加密密码 |


    六、完整代码下载(可自行复制粘贴)

    你可以将上述loginwindow.hloginwindow.cpp代码分别复制到你的Qt项目中。


    七、注意事项

    • QSettings默认保存在系统注册表中(Windows),或用户目录下(Linux/macOS)。
    • 如果你希望将数据保存在文件中,可以使用QSettings的文件路径参数。
    • 口令回显虽然看起来简单,但实际开发中可能需要更复杂的处理(如防止用户输入非密码字符等)。

    如果你有进一步的问题,比如如何添加数据库支持、如何加密密码、或者如何实现多语言界面,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 7月13日