学习日记1:qt用户分级登录(多权限登录)以及记住密码功能的实现


菜鸡学习日记,欢迎指点!

实现效果

在这里插入图片描述

  • 用户分级登录后的页面还未设计,暂用空白页代替,已实现用户对应信息在信息库的比对以及记住密码功能。

  • 登录逻辑就是将用户输入的信息拿去与数据库的初始数据做对比,如果账号名密码ID都一样,则登录成功。记住密码部分逻辑分写ini文件和读ini文件,每次在构造函数里面读取ini文件,若上次选择记住密码,则将信息显示至信息框中,反之,不显示;每次登录成功后,将信息写入ini文件中。

主要代码

1、connect.h 主要用于创建数据库、以及创建用户信息表

//判断表是否存在
bool isTableExists(const QString &table)
{
    QSqlQuery query;
    QString sql = QString("select * from sqlite_master where name = '%1';").arg(table);  // 查询sqlite_master表中是否存在表名
    if(query.exec(sql))//如果存在返回第一个结果
    {
        return query.next();
    }
    return false;
}


static bool createConnection()//static:所有类共享的函数
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//创建连接数据库实例
    db.setDatabaseName("userdatebase.db");
    if (!db.open())//没能成功建立用户数据库
    {
        QMessageBox::critical(0, qApp->tr("Cannot open database"),
        qApp->tr("Unable to establish a database connection."), QMessageBox::Cancel);
        return false;
    }
    if(!isTableExists("UserManagement"))//如果已经存在相同名字的表
    {
        QSqlQuery query;//操作数据库的实例
        //创建一个表User,包含索引,用户名,密码,用户类型
        query.exec("create table UserManagement (id int primary key,name varchar(20),password varchar(20),type varchar(20))");
        query.exec("insert into UserManagement values(0, 'root','123456','Root')");
        query.exec("insert into UserManagement values(1, 'admin','chen','Administrator')");
        query.exec("insert into UserManagement values(2, 'cym','0108','User')");
 //插入新用户也可以用以下代码
//        query.prepare("insert into User(userName, password, type)"
//                      "values (:userName, :password, :type)");
//        query.bindValue(":userName", userName);
//        query.bindValue(":password", password);
//        query.bindValue(":type", int(userType));
//        query.exec();
        return true;
    }

    return false;
}

2、login.cpp 主要实现登录按钮,用户信息比对以及记住密码功能

#define CONFIGPATH (QCoreApplication::applicationDirPath() + "config.ini") //设置一个用于存储的ini文件
login::login(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::login)
{
    ui->setupUi(this);
    loginInit();//登录界面初始化
}

login::~login()
{
    delete ui;
}

void login::loginInit()
{
    QSettings setting(CONFIGPATH, QSettings::IniFormat); // 打开存放登录信息的ini文件
    setting.setIniCodec(QTextCodec::codecForName("UTF-8")); // 设置编码格式,如果这里有中文,读和写的时候都要保持一致
    QString isremember = setting.value("login/isremember").toString(); // 是否选择了记住密码
    QString name = setting.value("login/username").toString(); // 账号
    QString password = setting.value("login/password").toString(); // 密码
    ui->lineEdit_user->setText(name); // 显示上一次登录的账号名
    if (isremember == "true") // 记住密码
    {
        ui->lineEdit_pwd->setText(password); // 密码写在密码输入框
        ui->checkBox_rempwd->setChecked(true); // 记住密码那里打√
        ispassword = true; // 记住密码
    }
    else
    {
        ui->checkBox_rempwd->setChecked(false); // 记住密码那里不打√
        ispassword = false; // 不记住密码
    }
}

//登录按钮
void login::on_pushButton_login_clicked()
{
    createConnection();
    mymodel_login = new QSqlTableModel(this);
    mymodel_login->setTable("UserManagement");//设置表的名称
    mymodel_login->setEditStrategy(QSqlTableModel::OnManualSubmit);// 设置编辑策略

    //获取用户名,密码,类型
    QString user_name = ui->lineEdit_user->text().trimmed();//trimmed去除开头结尾的空白字符串
    QString user_pwd = ui->lineEdit_pwd->text().trimmed();
    QString user_type = ui->comboBox_ID->currentText().trimmed();
    if(user_name.isEmpty())
    {
        QMessageBox::about(this, "注意!", "用户名不能为空");
        return;
    }
    if(user_pwd.isEmpty())
    {
        QMessageBox::about(this, "注意!", "用户密码不能为空");
        return;
    }


    QSqlQuery query;

//方法1
    mymodel_login->setFilter(QString("name = '%1'").arg(user_name));//可选择使用
    QString str="select count(id) from UserManagement where name='"+user_name+"' and password='"+user_pwd+"'and type='"+user_type+"'";
    query.exec(str);//执行选择语句
    query.next();//指针指向结果
    int count = query.value(0).toInt();//将指针所指的第一个字段取出,如果有就说明成功比对
    if(count == 1)
    {
        qDebug() <<user_type <<":"<< user_name << "logining...";
        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", user_name); // 把账号写入ini文件
        writeini.setValue("login/password", user_pwd); // 把密码写入ini文件
        accept();
    }

//方法2
//    QString sql = QString("select * from UserManagement where name = '%1';").arg(user_name);  // 查询用户
//    if(query.exec(sql))
//    {
//        if(query.next())   // true则用户存在
//        {
//             qDebug()<< query.value("name").toString();
//            if(user_pwd == query.value("password").toString())   // 密码相等
//                if(user_type==query.value("type").toString())    //身份相等
//                {
//                      accept();//进入
//                }
//        }
//    }
	

    else
    {
        QMessageBox::information(this,"提示","用户名或密码错误");
    }

}

//记住密码
void login::on_checkBox_rempwd_clicked()
{
    // 根据是否记住密码改变标志位
    ispassword = ui->checkBox_rempwd->isChecked();
}

小结

  1. sql中三个频繁使用的类,QsqlQuery(执行sql语句相关)、QsqlDatabase(连接数据库相关)、QSqlTableModel(用来显示数据库中数据表的数据,实现对数据的编辑、插入、删除等操作),需要简单了解如何使用。
    贴几个佬关于这方面的介绍:
    1)QsqlQuery
    https://blog.csdn.net/u012175418/article/details/76774551
    https://blog.csdn.net/xr469786706/article/details/78035514
    2)QSqlTableModel
    https://blog.csdn.net/wzz953200463/article/details/114552235

  2. 简单的sql语法需要掌握,select、insert、delete等

  3. QCoreApplication::applicationDirPath()的路径问题,使用后发现ini文件存在项目生成的build里面,数据库文件也在里面。

待优化部分

  1. 登录页面背景图
  2. 用户实现中文输入
  3. 自动登录选项
  4. 注册页面

代码下载

链接:https://pan.quark.cn/s/d7d44a377ba3
提取码:MUbf

  • 38
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在提供的代码中,没有直接涉及到注册和保存账号密码功能。但是可以根据代码的框架进行相应的修改来实现这个功能。 首先,在LoginPassword类中添加一个注册按钮,并为其添加一个槽函数。在槽函数中,获取用户输入的账号和密码,并将其保存到配置文件中。可以使用QSettings类来实现配置文件的读写操作。 ```cpp // 添加注册按钮 private slots: void pushButton_register_clicked(); // 注册按钮的槽函数 void LoginPassword::pushButton_register_clicked() { QString username = ui.lineEdit_username->text(); QString password = ui.lineEdit_password->text(); // 使用QSettings类保存账号密码到配置文件 QSettings settings(CONFIGPATH, QSettings::IniFormat); settings.setValue("Account/Username", username); settings.setValue("Account/Password", password); QMessageBox::information(this, "注册成功", "账号密码已成功保存!"); } ``` 然后,在Widget类中添加一个注册按钮,并为其添加一个槽函数。在槽函数中,获取用户输入的账号和密码,并将其保存到配置文件中。 ```cpp // 添加注册按钮 private slots: void pushButton_register_clicked(); // 注册按钮的槽函数 void Widget::pushButton_register_clicked() { QString username = ui.lineEdit_2->text(); QString password = ui.lineEdit->text(); // 使用QSettings类保存账号密码到配置文件 QSettings settings(CONFIGPATH, QSettings::IniFormat); settings.setValue("Account/Username", username); settings.setValue("Account/Password", password); QMessageBox::information(this, "注册成功", "账号密码已成功保存!"); } ``` 这样,当用户点击注册按钮时,会将账号和密码保存到配置文件中。你可以根据自己的需求修改保存的路径和文件名。 请注意,为了使注册功能生效,你还需要在相应的界面中添加注册按钮,并将其与槽函数进行连接。 #### 引用[.reference_title] - *1* [QT 记住账号密码登录](https://blog.csdn.net/Myq5683/article/details/127700333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [qt 获取登录界面账号和密码](https://blog.csdn.net/moonlightpeng/article/details/128040014)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值