QT C++实践| 连接数据库的登录界面实现| 附源码

前言

在之前的两篇博客中QT C++实战:实现用户登录页面及多个界面跳转QT C++实践|超详细数据库的连接和增删改查操作|附源码分别详细讲解了:登录界面的制作(UI布局、页面跳转、登录逻辑等)、QT如何连接Mysql数据库,并进行增删改查。

在前者登录界面的实现中,我们是把用户名和密码设死在代码内部的,不涉及到数据库,虽然这样很简单,但是实际过程中还是不够人性化。今天,我们要将这两个知识点结合起来,如何在登陆中连接数据库,实现用户登录。

Tips:本篇博客默认已经阅读前两篇博客,并已经拥有如何连接数据库和设计登录的UI界面的基础,固省略很多细节,主要讲"变"。强烈建议先阅读前两篇博客!

一、实现

1.1:前言

  • 在登录界面连接数据库,调用connection.h中的createConnection()创建数据库连接。

  • 在关闭界面的函数内,关闭数据库,释放资源:

    cpp 复制代码
    if (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;

	//}
}
相关推荐
逆小舟2 小时前
【Linux】人事档案——用户及组管理
linux·c++
l1t2 小时前
利用DeepSeek实现服务器客户端模式的DuckDB原型
服务器·c语言·数据库·人工智能·postgresql·协议·duckdb
lqjun08274 小时前
Qt程序单独运行报错问题
开发语言·qt
MarkHard1236 小时前
如何利用redis使用一个滑动窗口限流
数据库·redis·缓存
风中的微尘6 小时前
39.网络流入门
开发语言·网络·c++·算法
混分巨兽龙某某7 小时前
基于Qt Creator的Serial Port串口调试助手项目(代码开源)
c++·qt creator·串口助手·serial port
小冯记录编程7 小时前
C++指针陷阱:高效背后的致命危险
开发语言·c++·visual studio
island13147 小时前
【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
数据库·redis·bootstrap
心想事成的幸运大王7 小时前
Redis的过期策略
数据库·redis·缓存
倔强的石头_7 小时前
CentOS 上安装KingbaseES(ISO包)详细教程
数据库