一、相关函数介绍
QT将数据库分为三个层次:
1> 数据库驱动层:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin
2> sql接口层:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError
3> 用户接口层:提供一些模型QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel
二、源码
.pro
.ui
.h
本项目的槽函数生成方式为:
ui界面--->右击组件--->转到槽--->在.cpp文件中实现其相关函数
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSqlDatabase> //数据库管理类
#include <QSqlQuery> //执行sql语句对应的类
#include <QSqlRecord> //记录类
#include <QMessageBox> //消息对话框类
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_inputBtn_clicked(); //自定义录入按钮的槽函数
void on_showBtn_clicked(); //自定义展示按钮的槽函数
void on_serachBtn_clicked(); //自定义查找按钮的槽函数
void on_deleteBtn_clicked(); //自定义删除按钮的槽函数
private:
Ui::Widget *ui;
//定义一个数据库对象
QSqlDatabase db;
};
#endif // WIDGET_H
.main
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
.cpp
1> 在构造函数中打开数据库、创建表
2> 自定义实现组件的槽函数
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//判断数据库对象是否包含了自己使用的数据库 Student.db
if(!db.contains("Student.db"))
{
//添加一个数据库
//函数原型:static QSqlDatabase addDatabase(const QString& type));
//参数: 数据库的版本
//返回值: 添加的数据库
db = QSqlDatabase::addDatabase("QSQLITE"); //表明使用的是sqlite3版本的数据库(从帮助手册中查找)
//给数据库命名
db.setDatabaseName("Student.db");
}
//打开数据库
if(!db.open())
{
QMessageBox::information(this,"提示","数据库打开失败");
return;
}
//此时说明数据库已经创建出来并打开了,就可以创建数据表了
//创建数据表需要使用sql语句,需要使用QSQLQuerry类对象来完成
//准备sql语句
QString sql = "create table if not exists myTable(" //创建表的sql语句
"id integer primary key autoincrement," //设置id为主键,允许自增autoincrement
"numb integer," //学号,整型
"name varchar(10)," //姓名,字符串
"score integer," //成绩,整型
"sex varchar(4))"; //性别,字符串
//定义语句执行者
QSqlQuery querry;
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","创建表失败");
}
else
{
QMessageBox::information(this,"成功","创建表成功");
}
}
Widget::~Widget()
{
delete ui;
}
//录入按钮对应的槽函数
void Widget::on_inputBtn_clicked()
{
//清空信息
ui->tableWidget->clear();
//1、获取ui界面中要存入数据库中的数据
int numb_ui = ui->numbEdit->text().toUInt(); //获取ui界面的学号
QString name_ui = ui->nameEdit->text(); //获取ui界面的姓名
int score_ui = ui->scoreEdit->text().toUInt(); //获取ui界面的成绩
QString sex_ui = ui->sexEdit->text(); //获取ui界面的性别
//2、判断是否有漏填数据
if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0 || sex_ui.isEmpty())
{
QMessageBox::information(this,"提示","请将信息填写完整");
return;
}
//3、准备sql语句
QString sql = QString("insert into myTable(numb,name,score,sex) "
"values(%1,'%2',%3,'%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);
//qDebug()<<sql;
//4、实例化一个执行者
QSqlQuery querry;
//调用执行者的相关函数执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","插入数据失败");
}
else
{
QMessageBox::information(this,"成功","数据录入成功");
}
}
//展示按钮对应的槽函数
void Widget::on_showBtn_clicked()
{
//清空信息
ui->tableWidget->clear();
//1、准备sql语句
QString sql = "select * from myTable";
//2、准备语句执行者
QSqlQuery querry;
//3、执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","查询失败");
return;
}
//4、此时,将查找到的所有结果,全部都放在querry对象中了
//可以通过next函数不断遍历查询结果
int i = 0; //记录行号
while(querry.next())
{
//遍历的就是任意一组记录,querry.recored 返回值:当前记录
//qDebug()<<querry.record();
//要找到每条记录中的每个数据 使用value函数 querry.record().value(i); //代表遍历任意一列(i)
//qDebug()<<querry.record().value(2);
//querry.record().value(2).toString(); //将记录的某一项的数据转变成字符串
//querry.record().count(); //返回当前记录对应数据项的个数
//将数据库中的表格展示到ui界面
//ui->tableWidget->setItem()
for(int j = 0; j<querry.record().count()-1; j++)
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));
}
i++; //进行下一行
}
}
//查找按钮对应的槽函数
void Widget::on_serachBtn_clicked()
{
//清空信息
ui->tableWidget->clear();
//1、获取ui界面的信息(学号、姓名)
int numb_ui = ui->numbEdit->text().toUInt();
QString name_ui = ui->nameEdit->text();
//2、判断是否有漏填数据
if(numb_ui == 0 || name_ui.isEmpty())
{
QMessageBox::information(this,"提示","请将查询信息补充完整");
return;
}
//3、准备sql语句
QString sql = QString("select * from myTable WHERE numb = '%1' AND name = '%2'").arg(numb_ui).arg(name_ui);
qDebug()<<sql;
//4、实例化一个执行者
QSqlQuery querry;
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","查找失败");
return;
}
// if(!querry.next())
// {
// QMessageBox::information(this,"失败","查找失败,无匹配数据");
// return;
// }
int i = 0;
//5、遍历查找到的数据,并将数据填充到ui界面中
while(querry.next())
{
for(int j = 0 ;j<querry.record().count()-1;j++)
{
ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));
}
}
}
//删除按钮对应的槽函数
void Widget::on_deleteBtn_clicked()
{
//清空信息
ui->tableWidget->clear();
//1、从ui界面获取信息(学号、姓名)
int numb_ui = ui->numbEdit->text().toUInt();
QString name_ui = ui->nameEdit->text();
//2、判断数据是否漏填
if(numb_ui == 0 || name_ui.isEmpty())
{
QMessageBox::information(this,"提示","请将删除信息补充完整");
return;
}
//3、准备sql语句
QString sql = QString("delete from myTable WHERE numb = '%1' AND name = '%2'").arg(numb_ui).arg(name_ui);
//4、实例化一个执行者
QSqlQuery querry;
if(!querry.exec(sql))
{
QMessageBox::information(this,"失败","删除失败");
return;
}
else
{
QMessageBox::information(this,"成功","删除成功");
}
}
三、效果演示
1> 主界面
2> 录入
3> 展示
4> 查找
5> 删除