前言
在之前的两篇博客中QT C++实战:实现用户登录页面及多个界面跳转、QT C++实践|超详细数据库的连接和增删改查操作|附源码分别详细讲解了:登录界面的制作(UI布局、页面跳转、登录逻辑等)、QT如何连接Mysql数据库,并进行增删改查。
在前者登录界面的实现中,我们是把用户名和密码设死在代码内部的,不涉及到数据库,虽然这样很简单,但是实际过程中还是不够人性化。今天,我们要将这两个知识点结合起来,如何在登陆中连接数据库,实现用户登录。
Tips:本篇博客默认已经阅读前两篇博客,并已经拥有如何连接数据库和设计登录的UI界面的基础,固省略很多细节,主要讲"变"。强烈建议先阅读前两篇博客!
一、实现
1.1:前言
-
在登录界面连接数据库,调用
connection.h
中的createConnection()
创建数据库连接。 -
在关闭界面的函数内,关闭数据库,释放资源:
cppif (db.isOpen()) { db.close(); } // 然后,从连接池中移除该连接 QSqlDatabase::removeDatabase("connection1");
-
遍历数据库,将用户名、密码依次和数据库中的信息进行对比,若有一样,则可以进入主界面。
💁🏻♀️使用 QSqlQuery 来执行一个查询,并使用循环来遍历结果集
1.2:具体
首先在登陆界面Login.cpp
的构造函数中加入下面创建数据库连接的代码:
cpp
//创建数据库连接
if (!createConnection()) {
return;
}
db = QSqlDatabase::database("connection1");//
注意db
是定义在头文件中公共成员变量中的:
cpp
public:
Login(QWidget *parent = nullptr);
~Login();
QSqlDatabase db;
再就是主要修改登录界面的登录按钮的槽函数:
cpp
//登录按钮对应槽函数:登陆成功跳转到主功能界面or管理员界面
void Login::inlog_clicked() {
//获取用户名和密码输入框中数据
QString nameString = ui.name->text();
QString pswdString = ui.pswd->text();
//遍历数据库
int non_flag = 1;//标志数据库中没有该用户信息
QSqlQuery query(db);
query.exec("select * from user");//执行sql语句
bool success = query.exec("SELECT * FROM user");
if (success) {
while (query.next()) {
//获取
QString uName = query.value(1).toString();
QString uPwd = query.value(2).toString();
//QMessageBox::about(this, "显示", "用户名:"+uName +"密码"+uPwd);
//比较
if (nameString == uName && pswdString == uPwd) {
//创建功能主界面并显示
new_QT_python* w = new new_QT_python();
this->hide();
non_flag = 0;
w->show();
db.close();
QSqlDatabase::removeDatabase("connection1");
break;
}
}
if (non_flag) {
QMessageBox::about(this, "警告", "用户名或密码错误");
}
}
else {
// 查询执行失败
QSqlError error = query.lastError();
QString errorMessage = error.text();
QMessageBox::about(this, "数据库错误", "查询失败" + errorMessage);
}
//if (nameString == QString::fromLocal8Bit("admin")&& pswdString == QString::fromLocal8Bit("123456")) {
// Admin* w = new Admin();
// this->close();
// w->show();
//}
//else if (nameString == QString::fromLocal8Bit("user") && pswdString == QString::fromLocal8Bit("111111")) {
// //创建功能主界面并显示
// new_QT_python* w = new new_QT_python();
// this->close();
// w->show();
//}
//else {
// QMessageBox::about(this, "警告", "用户名或密码错误");
// return;
//}
}