案例
实现添加、展示、删除、排序(按成绩降序)操作
widget.h代码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QSqlDatabase> //数据库管理类
#include<QSqlQuery> //数据库查询类
#include<QSqlRecord> //记录类
#include <QMessageBox> //消息对话框
#include <QtDebug>
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_addBtn_clicked();
void on_showBtn_clicked();
void on_deleteBtn_clicked();
void on_sortBtn_clicked();
private:
Ui::Widget *ui;
QSqlDatabase db; //使用无参构造,实例化一个数据库管理类对象
};
#endif // WIDGET_H
widget.cpp代码
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//想要添加某个数据库
if(!db.contains("stu.db"))
{
//如果当前对象中没有包含所需的数据库,则添加一个数据库
db = QSqlDatabase::addDatabase("QSQLITE"); //添加一个sqlite3的数据库
db.setDatabaseName("stu.db"); //设置数据库的名称
}
//4、打开数据库
if(!db.open())
{
QMessageBox::information(this,"提示","数据库打开失败");
return;
}
//程序执行至此,表示数据库创建成功并打开了
//准备创建数据表
//1、实例化一个sql语句的执行者
QSqlQuery querry;
//2、准备sql语句
QString sql = "create table if not exists STU(id int, name char, sex char, score double);";
//3、执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","数据表创建失败");
return ;
}
//程序执行至此,表示数据表也创建成功了
}
Widget::~Widget()
{
delete ui;
}
//添加信息按钮对应的槽函数
void Widget::on_addBtn_clicked()
{
//1、将ui界面上的信息获取来
int ui_id = ui->numEdit->text().toUInt(); //获取学号
QString ui_name = ui->nameEdit->text(); //姓名
QString ui_sex = ui->sexEdit->text(); //性别
double ui_score = ui->scoreEdit->text().toDouble(); //分数
//2、判断信息中是否有空的
if(ui_id == 0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score == 0)
{
QMessageBox::information(this,"提示","请将信息填写完整");
return ;
}
//3、准备sql语句
QString sql = QString("insert into STU(id,name,sex,score) values(%1,'%2','%3',%4);")
.arg(ui_id).arg(ui_name).arg(ui_sex).arg(ui_score);
//qDebug() <<sql;
//4、实例化sql语句执行者
QSqlQuery querry;
//5、执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","添加信息失败");
return ;
}else
{
QMessageBox::information(this,"提示","添加成功");
}
}
//展示信息按钮对应的槽函数
void Widget::on_showBtn_clicked()
{
//1、实例化一个sql语句执行者
QSqlQuery querry;
//2、准备sql语句
QString sql = "select * from STU;";
//3、执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","查询失败");
return ;
}
//程序执行至此,表示已经完成数据库的查询,并将结果存放到querry对象中,可以通过next函数进行遍历每个结果集
//函数原型:bool next();
//功能:读取查询结果集的下一条记录,如果记录不为空,就返回真,否则返回假
int i=0; //遍历结果集的行
while(querry.next())
{
//获取当前记录
QSqlRecord record = querry.record();
//对当前记录进行操作,遍历当前记录的所有字段
for(int j=0;j<record.count();j++)
{
//qDebug() << record.value(j).toString();
//该循环中的value(j),表示的就是第i行j列的那个元素
//record.value(j).toString();
//ui->msgTable->setItem(i,j,new QTableWidgetItem(record.value(j).toString()));
QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString()); //将数据库中的字段,封装成ui界面上的一条信息
ui->msgTable->setItem(i,j,item); //将信息进行展示
}
i++; //表示行数增加
}
}
//删除信息按钮对应的槽函数
void Widget::on_deleteBtn_clicked()
{
//1、将ui界面上的信息获取来
int ui_id = ui->numEdit->text().toUInt();
QString ui_name = ui->nameEdit->text();
QString ui_sex = ui->sexEdit->text();
double ui_score = ui->scoreEdit->text().toDouble();
//2、判断信息中是否有空的
if(ui_id == 0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score == 0)
{
QMessageBox::information(this,"提示","请将信息填写完整");
return ;
}
//3、准备sql语句
QString sql = QString("delete from STU WHERE id = %1 AND name = '%2' AND sex = '%3' AND score = %4;")
.arg(ui_id).arg(ui_name).arg(ui_sex).arg(ui_score);
//qDebug() <<sql;
//4、实例化sql语句执行者
QSqlQuery querry;
//5、执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","删除信息失败");
return ;
}else
{
QMessageBox::information(this,"提示","删除成功");
}
}
//信息排序按钮对应的槽函数
void Widget::on_sortBtn_clicked()
{
//1、实例化一个sql语句执行者
QSqlQuery querry;
//2、准备sql语句
//QString sql = "select * from STU ORDER BY score ASC;"; //升序
QString sql = "SELECT * FROM STU ORDER BY score DESC;"; //降序
//3、执行sql语句
if(!querry.exec(sql))
{
QMessageBox::information(this,"提示","查询失败");
return ;
}
//功能:读取查询结果集的下一条记录,如果记录不为空,就返回真,否则返回假
int i=0; //遍历结果集的行
while(querry.next())
{
QSqlRecord record = querry.record();
//对当前记录进行操作,遍历当前记录的所有字段
for(int j=0;j<record.count();j++)
{
//qDebug() << record.value(j).toString();
//该循环中的value(j),表示的就是第i行j列的那个元素
//record.value(j).toString();
//ui->msgTable->setItem(i,j,new QTableWidgetItem(record.value(j).toString()));
QTableWidgetItem *item = new QTableWidgetItem(record.value(j).toString());
ui->msgTable->setItem(i,j,item);
}
i++; //表示行数增加
}
}
运行效果
点击添加
任意一项为空,都会弹出提示“请将信息填写完整”
点击展示
点击删除
任意一项为空,都会弹出提示“请将信息填写完整”