qt完成登录窗口的制作,错误的密码情况下,给用户三次登录机会,如果输入错误超过三次,锁定账号并跨天解锁; 如果用户勾选了“记住用户和密码”,需要记录用户名和密码,下次自动填充并登录;口令的回显——定时器,完整步骤
5条回答 默认 最新
檀越@新空间 2025-07-13 10:47关注上午好☀️☀️☀️️
本答案参考通义千问在Qt中实现一个带有登录功能的窗口,包括**错误密码尝试次数限制、账号锁定、记住用户和密码、口令回显(定时器)**等功能,是一个较为完整的项目。以下是详细的实现步骤:
一、项目结构
- 主窗口类:
LoginWindow- 包含用户名输入框、密码输入框、记住我复选框、登录按钮、提示信息标签。
- 数据存储方式:使用
QSettings保存用户信息(可选文件存储) - 逻辑控制:使用
QTimer实现口令回显
二、核心功能说明
1. 错误密码尝试次数限制
- 用户每次输入错误密码时,计数器加1。
- 如果超过3次,锁定账户,并显示“账号已锁定”提示。
- 锁定后,需等待一天后才能再次尝试。
重点:锁定机制需要记录锁定时间,并在下次启动时判断是否解锁。
2. 记住用户和密码功能
- 使用
QSettings将用户名和密码保存到本地。 - 如果勾选了“记住我”,则在下次启动时自动填充用户名和密码。
- 自动登录功能:如果用户名和密码都存在且正确,则自动登录。
3. 口令回显(定时器)
- 使用
QTimer每隔一段时间(如0.5秒)更新密码框中的内容。 - 每次更新时,将密码字符替换为星号(
*)或其它符号。
三、完整实现步骤(代码示例)
1. 创建项目
- 打开Qt Creator,创建一个新的Qt Widgets Application项目。
- 名称:
LoginApp - 基类选择
QMainWindow或QDialog
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); } }
四、关键逻辑总结
-
锁定机制
- 使用
QSettings保存锁定时间。 - 每次启动程序时检查当前时间是否大于锁定时间。
- 使用
-
记住用户和密码
- 使用
QSettings保存用户名和密码。 - 自动登录逻辑:如果存在且正确,直接登录。
- 使用
-
口令回显
- 使用
QTimer每隔0.5秒更新密码框内容。 - 将输入内容替换为
*。
- 使用
五、扩展建议
| 功能点 | 实现方式 | |----------------|----------------------------------| | 账号锁定验证 | 在程序启动时读取
lockTime并比较 | | 多用户支持 | 使用数据库或文件存储多个用户信息 | | 加密存储密码 | 使用QCryptographicHash加密密码 |
六、完整代码下载(可自行复制粘贴)
你可以将上述
loginwindow.h和loginwindow.cpp代码分别复制到你的Qt项目中。
七、注意事项
QSettings默认保存在系统注册表中(Windows),或用户目录下(Linux/macOS)。- 如果你希望将数据保存在文件中,可以使用
QSettings的文件路径参数。 - 口令回显虽然看起来简单,但实际开发中可能需要更复杂的处理(如防止用户输入非密码字符等)。
如果你有进一步的问题,比如如何添加数据库支持、如何加密密码、或者如何实现多语言界面,欢迎继续提问!
解决 无用评论 打赏 举报- 主窗口类: