弄了个简单的记住账号密码登录功能,适合初学者学习,直接上代码,代码有注释。
喂饭到嘴边了,看你会不会吃啦
开发环境是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_OBJECTpublic: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、效果显示