题目1:Qt 实现用户登录界面及记住密码功能
要求:
1、用户登录界面包括用户名和密码输入框,密码框支持显示和隐藏密码。
2、支持记住密码功能,通过复选框保存用户是否选择记住密码。
3、在退出时保存用户的登录信息(如用户名和密码),并支持加载这些信息。
4、支持管理用户的账号列表,通过双击列表项删除用户,检查用户名是否重复并添加新账号。
widget.cpp
#include "widget.h"
#include "ui_widget.h"// 构造函数
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{// 设置 UI 界面ui->setupUi(this);// 加载用户名,并填充到文本框QString name = load_data("C:/Users/80657/Documents/QT_PROJECT/name.txt");ui->lineEdit->setText(name);// 加载密码,并填充到密码框QString pwd = load_data("C:/Users/80657/Documents/QT_PROJECT/pwd.txt");ui->lineEdit_2->setText(pwd);// 判断是否选中了“记住密码”QString rememberPwd = load_data("C:/Users/80657/Documents/QT_PROJECT/rememberPwd.txt");if (rememberPwd == "true") { // 如果记住密码ui->checkBox->setChecked(true); // 复选框设为选中} else { // 如果不记住密码ui->checkBox->setChecked(false); // 复选框设为未选中ui->lineEdit_2->clear(); // 清空密码输入框}}// 析构函数
Widget::~Widget()
{// 获取用户名,并保存到文件QString name = ui->lineEdit->text();save_data("C:/Users/80657/Documents/QT_PROJECT/name.txt", name);// 获取密码,并保存到文件(暂未启用)QString pwd = ui->lineEdit_2->text();save_data("C:/Users/80657/Documents/QT_PROJECT/pwd.txt", pwd);/*这里的代码被注释掉了,实际逻辑如下:如果勾选“记住密码”,则保存密码,否则清空密码文件if (ui->checkBox->isChecked()) {QString pwd = ui->lineEdit_2->text();save_data("C:/Users/80657/Documents/QT_PROJECT/pwd.txt", pwd);save_data("C:/Users/80657/Documents/QT_PROJECT/rememberPwd.txt", "true");} else {save_data("C:/Users/80657/Documents/QT_PROJECT/pwd.txt", ""); // 清空密码save_data("C:/Users/80657/Documents/QT_PROJECT/rememberPwd.txt", "false");}*/// 释放 UI 资源delete ui;
}// 保存数据到指定文件
void Widget::save_data(const QString& filename, const QString& data)
{file.setFileName(filename); // 设置文件路径file.open(QFile::WriteOnly); // 以写入模式打开文件file.write(data.toLocal8Bit()); // 写入数据file.close(); // 关闭文件
}// 从指定文件加载数据
QString Widget::load_data(const QString &filename)
{file.setFileName(filename); // 设置文件路径file.open(QFile::ReadOnly); // 以只读模式打开文件QByteArray arr = file.readAll(); // 读取所有数据QString str = QString::fromLocal8Bit(arr); // 转换为 QStringfile.close(); // 关闭文件return str; // 返回数据
}// 监听用户名输入框内容变化
void Widget::on_lineEdit_textChanged(const QString &arg1)
{QString name = ui->lineEdit->text(); // 获取用户名输入框内容QString pswd = ui->lineEdit_2->text(); // 获取密码输入框内容if (name.isEmpty() || pswd.isEmpty()) { // 如果用户名或密码为空ui->pushButton->setEnabled(0); // 禁用账号按钮ui->pushButton_2->setEnabled(0); // 禁用密码按钮} else { // 否则ui->pushButton->setEnabled(1); // 启用账号按钮ui->pushButton_2->setEnabled(1); // 启用密码按钮}
}// 监听密码输入框内容变化
void Widget::on_lineEdit_2_textChanged(const QString &arg1)
{QString name = ui->lineEdit->text(); // 获取用户名输入框内容QString pswd = ui->lineEdit_2->text(); // 获取密码输入框内容if (name.isEmpty() || pswd.isEmpty()) { // 如果用户名或密码为空ui->pushButton->setEnabled(0); // 禁用账号按钮ui->pushButton_2->setEnabled(0); // 禁用密码按钮} else { // 否则ui->pushButton->setEnabled(1); // 启用账号按钮ui->pushButton_2->setEnabled(1); // 启用密码按钮}
}// 按下“显示密码”按钮时,密码框显示明文
void Widget::on_pushButton_3_pressed()
{ui->lineEdit_2->setEchoMode(QLineEdit::Normal); // 设置密码框为明文显示
}// 释放“显示密码”按钮时,密码框恢复为密文
void Widget::on_pushButton_3_released()
{ui->lineEdit_2->setEchoMode(QLineEdit::Password); // 设置密码框为密文显示
}// 监听“记住密码”复选框状态变化
void Widget::on_checkBox_stateChanged(int state)
{if (state == Qt::Checked) { // 如果复选框被选中save_data("C:/Users/80657/Documents/QT_PROJECT/rememberPwd.txt", "true"); // 记录记住密码状态} else { // 如果复选框未选中save_data("C:/Users/80657/Documents/QT_PROJECT/rememberPwd.txt", "false"); // 记录不记住密码状态save_data("C:/Users/80657/Documents/QT_PROJECT/pwd.txt", ""); // 清空密码}
}void Widget::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{// 获取选中的账号(用户名)QString selectedAccount = item->text();// 在列表中删除选中的账号delete item;
}void Widget::on_pushButton_clicked()
{// 获取用户输入的用户名QString newUsername = ui->lineEdit->text();// 判断用户名是否为空if (newUsername.isEmpty()) {// 提示用户输入有效的用户名(可选)// QMessageBox::warning(this, "输入错误", "用户名不能为空!");return;}// 检查该用户名是否已经存在于列表中bool exists = false;for (int i = 0; i < ui->listWidget->count(); ++i) {if (ui->listWidget->item(i)->text() == newUsername) {exists = true; // 如果找到重复的账号,则标记为存在break;}}// 如果该账号不存在,则添加到列表中if (!exists) {ui->listWidget->addItem(newUsername); // 添加到列表} //else {// 如果账号已经存在,提示用户(可选)// QMessageBox::information(this, "重复账号", "该账号已存在,请选择其他用户名!");//}
}
widget.h头文件
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QFile>
#include <QListWidget>
#include <QApplication>
#include <QDebug>
#include <QLabel>
#include <QLineEdit>
#include <QTextEdit>
#include <QPushButton>
#include <QWidget> // 基础窗口类
#include <QVBoxLayout>
#include <QDesktopWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void save_data(const QString& filename,const QString& data);QString load_data(const QString& filename);private slots:void on_lineEdit_textChanged(const QString &arg1);void on_lineEdit_2_textChanged(const QString &arg1);void on_pushButton_3_pressed();void on_pushButton_3_released();void on_checkBox_stateChanged(int arg1);void on_listWidget_itemDoubleClicked(QListWidgetItem *item);void on_pushButton_clicked();private:Ui::Widget *ui;QFile file;
};
#endif // WIDGET_H
//main.cpp#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
login.pro
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
题目2: 简易计算器设计