弄了个简单的记住账号密码登录功能,适合初学者学习,直接上代码,代码有注释。
喂饭到嘴边了,看你会不会吃啦
开发环境是VS2015
1、由于没有写注册功能,所以账号和密码我提前写在一个ini文件,这个文件直接手动写,我是用notepad++写的
上面那组是上次成功登录时是否记住密码,下面那组是账号和密码(好像ini文件的左边也就是键不支持中文,所以下面那组对应关系是 密码=账号 )
2、头文件 LoginPassword.h
#pragma once
#include <QtWidgets/QWidget>
#include "ui_LoginPassword.h"
#include <QSettings>
#include <QMessageBox>
#include <QTextCodec>
// 宏定义,存放登录信息的ini配置文件的绝对路径,你也可以自定义自己的路径,相对绝对都行
// 因为这里没有写注册功能,所以ini文件提前写好
#define CONFIGPATH (QCoreApplication::applicationDirPath() + "/config/config.ini")
class LoginPassword : public QWidget
{
Q_OBJECT
public:
LoginPassword(QWidget *parent = Q_NULLPTR);
private:
void loginInit();
private slots:
void checkBox_password_clicked();
void pushButton_login_clicked();
private:
Ui::LoginPasswordClass ui;
bool ispassword;
};
3、源文件 LoginPassword.cpp
#include "LoginPassword.h"
LoginPassword::LoginPassword(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
// 登录界面初始化
loginInit();
// 绑定信号和槽
connect(ui.checkBox_password, &QCheckBox::clicked, this, &LoginPassword::checkBox_password_clicked);
connect(ui.pushButton_login, &QPushButton::clicked, this, &LoginPassword::pushButton_login_clicked);
}
// 登录界面初始化
void LoginPassword::loginInit()
{
QSettings setting(CONFIGPATH, QSettings::IniFormat); // 打开存放登录信息的ini文件
setting.setIniCodec(QTextCodec::codecForName("UTF-8")); // 设置编码格式,因为我这里有中文,读和写的时候都要保持一致
QString isremember = setting.value("login/isremember").toString(); // 是否选择了记住密码
QString name = QString::fromUtf8(setting.value("login/username").toByteArray()); // 账号
QString lock = setting.value("login/password").toString(); // 密码
ui.lineEdit_username->setText(name); // 显示上一次登录的账号名
if (isremember == "true") // 记住密码
{
ui.lineEdit_password->setText(lock); // 密码写在密码输入框
ui.checkBox_password->setChecked(true); // 记住密码那里打√
ispassword = true; // 记住密码
}
else
{
ui.checkBox_password->setChecked(false); // 记住密码那里不打√
ispassword = false; // 不记住密码
}
}
// 登录
void LoginPassword::pushButton_login_clicked()
{
QString textname = ui.lineEdit_username->text(); // 获得输入的账号
QString textpassword = ui.lineEdit_password->text(); // 获得输入的密码
QSettings setting(CONFIGPATH, QSettings::IniFormat); // 打开ini文件
setting.setIniCodec(QTextCodec::codecForName("UTF-8")); // 设置编码格式
QStringList nameLockList = setting.childGroups(); // 获得ini文件的所有组
setting.beginGroup(nameLockList[0]); // 选择账号密码那组(这组在下面,下标组名却是0)
bool islogin = false; // 用来查验账号密码是否正确
foreach(QString key, setting.childKeys()) // 遍历账号密码那组
{
if ((key == textpassword) && (QString::fromUtf8(setting.value(key).toByteArray()) == textname)) // 查验输入的账号密码和文件里的账号密码是否有对应的
{
islogin = true; // 如果遍历到有就改变标志位并退出
break;
}
}
if (islogin) // 说明账号密码正确
{
QSettings writeini(CONFIGPATH, QSettings::IniFormat); // 打开ini文件
writeini.setIniCodec(QTextCodec::codecForName("UTF-8")); // 设置编码格式
if (ispassword) // 选择保存密码
{
writeini.setValue("login/isremember", "true"); // 写ini文件时记录为true
}
else // 不保存密码
{
writeini.setValue("login/isremember", "false"); // 写ini文件时记录为false
}
writeini.setValue("login/username", textname); // 把账号写入ini文件
writeini.setValue("login/password", textpassword); // 把密码写入ini文件
// 消息提示,模拟登录成功,真正设计这里一般是跳转到主界面或播放登录动画
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("登录成功"));
}
else // 账号密码跟ini文件对不上
{
// 消息提示登录失败
QMessageBox::information(this, QStringLiteral("提示"), QStringLiteral("账号或密码有误,请重新登录"));
}
}
// 选择是否记住密码
void LoginPassword::checkBox_password_clicked()
{
// 根据是否记住密码改变标志位
ispassword = ui.checkBox_password->isChecked();
}
4、UI 界面
我用qt设计师界面设计写的,方便简单,没几个控件
5、效果显示