当前位置: 首页 > news >正文

Qt基础知识记录(终篇)

写在前面

        博主的项目所需知识已经差不多学完了,后续如果还需要再学习那就继续学,毕竟程序员就是摸着石头过河的,碰壁乃是常有的事情。博主的项目服务器是用MySQL存储数据的,所以博主学习一下Qt如何连接MySQL及从MySQL中存取数据

        博主的Qt是Qt6版本,这个版本需要专门将Qt与MySQL链接,博主已经配置好,不赘述了,如果有要在Qt中使用MySQL的同行,一定要先配环境

具体实现

(1)新建数据库

在MySQL命令行窗口里输入这些命令

mysql> create database testdatabase;
use testdatabase;
create table student (id integer unsigned primary key,name varchar(16) not null,birth date
)charset utf8;

(2)新建Qt项目

可以看到我的项目已经建好了,然后要注意:在pro文件里加上sql

QT       += core gui sql

(3)设计界面

并修改控件命名

这个项目要实现的功能是:点击查询,可以把信息显示到Qt下边的信息提示框;点击插入,在界面里输入的东西可以插到testdatabase里

(4)建立与MySQL的连接

先包含必要的头文件

#include<QSqlDatabase>
#include<QMessageBox>
#include<QSqlQuery>

在私有成员里声明数据库变量

QSqlDatabase db;

在构造函数里连接MySQL

db=QSqlDatabase::addDatabase("QMYSQL");db.setDatabaseName("testdatabase");
db.setHostName("localhost");
db.setUserName("root");
db.setPassword("*********");if(db.open())
{QMessageBox::information(this,"连接提示","连接成功");
}
else
{QMessageBox::warning(this,"连接提示","连接失败");
}

我来详细解释一下这段代码:

第一句是加载数据库驱动,因为Qt支持很多数据库,所以要先指定是MySQL数据库。

后边四句指的是连接一个叫做testdatabase的数据库,它的位置是主机,用户名是root,密码是**********。

然后是提示信息,如果成功连接的话就提示成功,不成功就报连接失败

                                                            

博主这里一切正常

(5)实现插入功能

右击插入按钮转到槽,在槽函数里写实现逻辑

void Widget::on_insertButton_clicked()
{QString id = ui->numberLineEdit->text();QString name = ui->nameLineEdit->text();QString birth =ui->birthLineEdit->text();QString sql = QString("insert into student values(%1,'%2','%3');").arg(id).arg(name).arg(birth);QSqlQuery query;if(query.exec(sql)){QMessageBox::information(this,"插入提示","插入成功");}else{QMessageBox::warning(this,"插入提示","插入失败");}
}

详细解释一下这段代码:

声明三个QString型变量,分别存储输入框里的学号、名字、生日

下一句是属于SQL的插入语句,这句的作用是把它放在MySQL里边,然后在MySQL里执行这一句。为了测试这句的真实性,可以提前写一句样板试试

insert into student values(1,"tom","1999-9-9");

这句话要替换的东西自然是id、name、birth,用Qt的高级语法来替换,类似于printf那种占位符,但是还要简洁一些。

然后是查询函数,查询sql这个变量有没有实现功能,如果实现的话就报成功,失败的话就报失败

测试结果如图:

在MySQL里同样有成功的结果:

                         

(6)实现查询操作

还是右击按钮转到槽,在槽函数里实现功能

void Widget::on_findButton_clicked()
{QSqlQuery query;query.exec("select * from student;");while(query.next()){qDebug()<<query.value(0);qDebug()<<query.value(1);qDebug()<<query.value(2);}
}

详细解释一下这段代码:

声明一个专用于查询的类的对象query,这个对象把构造函数里的语句放到MySQL里边,然后用一个循环来遍历查找的结果,query.next是指当前是不是最后一排数据,qDebug()函数可以在Qt下的输出框输出内容,value(0)指的是第一列数据,因为下标是从0开始的

运行结果也没问题:

功能优化

像上边提到的sql语句其实是比较笨的方法,Qt中开发者已经提供了很好的模型,我们直接用就行了,这里我要用一个叫做table view的控件

(1)再设计界面

利用Qstacked Widget控件,让输入是第一个界面,输出是第二个界面

以及下一页和上一页的槽函数:

void Widget::on_nextButton_clicked()
{ui->stackedWidget->setCurrentIndex(1);
}void Widget::on_frontButton_clicked()
{ui->stackedWidget->setCurrentIndex(0);
}

(2)使用table model

需要先包含头文件

#include<QSqlTableModel>

在构造函数里声明此类型变量

QSqlTableModel m;

在构造函数里初始化这个模型

if(db.open()){QMessageBox::information(this,"连接提示","连接成功");m = new QSqlTableModel;m->setTable("student");ui->tableView->setModel(m);}else{QMessageBox::warning(this,"连接提示","连接失败");}

先开一个m的空间,然后把它和MySQL里的student这张表连接起来,然后用tableView的setModel展示表格内容。注意:要在析构函数里释放m的空间

查询按钮的槽函数:

void Widget::on_getButton_clicked()
{m->select();
}

这个函数的意思是让数据库查询的结果和连接的table model连接起来

(3)效果展示

篇末总结

        《Qt基础知识记录》这个专栏我已经全部更新完了,博主是Qt小白,两个星期前从未接触过Qt,下载、安装、配环境都碰了不少壁。在b站里搜寻多方网课学习基础知识,算是勉强具备了Qt开发的能力。不过博主可能只会用Qt开发这一个项目了,因为相比于cpp,博主可能更想走java和go赛道,瓦go兼修,cpp仅仅是会用C++11就满意了。

        作为博主程序员历程接触的第一个语言,cpp伴随博主从无知走向青涩。博主从一个只知道玩电脑小游戏的菜鸡一步一步成长到现在,靠的都是cpp。如果可以博主想一直走cpp的,但是cpp这条赛道挺劝退人的,而且博主的学历bg也不是很好。做完本学期课设之后应该只有打a的时候会用cpp了。

        跟着网课一起做项目的效果是很明显的,因为博主在同时听算法课和Qt课,算法课没怎么动手,Qt课每节课博主都会跟着做。这次学习Qt的经历也告诉了我一定要边实践边听课。

        博主是编程界的小白,就想输出一些浅薄的见解,也算是一种学习,如果能让看到的人学到一些东西,我是非常开心的。

        目前博主是正在《数据结构和算法》、《基于Qt的基础知识记录》两个专栏,都是博主的思考和真实记录。后续会随着我的成长更新《java学习记录》、《go学习记录》、《MySQL学习记录》等等吧。

http://www.xdnf.cn/news/277993.html

相关文章:

  • 前端面试每日三题 - Day 24
  • SpringCloud教程 — 无废话从0到1逐步学习
  • 小刚说C语言刷题—1324扩建鱼塘问题
  • C++基础代码解释
  • dubbo 参数校验-ValidationFilter
  • KEIL5环境下利用HAL库开发STM32项目_工程搭建方法
  • 5.7/Q1,GBD数据库最新文章解读
  • org.apache.poi——将 office的各种类型文件(word等文件类型)转为 pdf
  • 解决 Builroot 系统编译 perl 编译报错问题
  • jeecg查询指定时间
  • 【分享】4D视差壁纸
  • Java运算符学习笔记
  • 【React Hooks原理 - useCallback、useMemo】
  • 大根堆+小根堆 问题
  • 【C++】封装unordered_set和unordered_map
  • 如何快速获取GPU参数,并解读其性能?
  • 【翻译、转载】【译文】图解模型上下文协议(MCP)
  • Day3:设置页面全局渐变线性渐变背景色uniapp壁纸实战
  • SALOME源码分析: SolverLab
  • 【Trae+LucidCoder】三分钟编写专业Dashboard页面
  • LabVIEW温控系统热敏电阻滞后问题
  • C++类_嵌套类
  • 【题解】CF196D (哈希)
  • 强化学习机器人模拟器——RobotApp:一个交互式强化学习模拟器
  • stm32卡在SystemClock_Config();的解决方法
  • 华为鸿蒙PC:开启国产操作系统自主化新纪元
  • 【网络】什么是串口链路(Serial Link)?
  • python hasattr()
  • 深入了解 OpenIddict:实现 OAuth 2.0 和 OpenID Connect 协议的 .NET 库
  • 《算法导论(第4版)》阅读笔记:p6-p6