基于Qt的登陆界面设计及记住密码,简易计算器设计
题目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); // 转换为 QString
file.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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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 gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += 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.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
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: 简易计算器设计