Qt C/C++编程小案例(1)Sqlite数据库操作之学生选课管理系统
提示:若积分太高,就私聊或者评论,我去降低,谢谢大家支持
ps:在这篇你能学到:
01.Qt操作Sqlite数据库
02.点击获取每行View里面的数据
03.view里面的数据转Excel表格
04.了解窗口之间的函数传递
1.视频演示地址:
Qt C++界面化 sqlite数据库的学生选课系统
2.案例需求:
2.1 基本要求:
课程信息包括:课程编号、课程名称、任课教师、学分、课程性质、开课院系等。
2.2 功能要求:
1)能够对课程信息进行输入、修改、删除操作;
2)按给定的条件(编号、名称、任课教师、开课院系等)查询课程信息;
3)以文件形式保存相关信息,可以读取默认文件中的信息进行查询等操作。
3.需求分析:
3.1根据需求我们可以选择3个方案,分别是使用SQL数据库、Sqlite数据库以及Excel表格。
1)可以使用电脑安装的SQL Server 2008 进行数据的存储,可以直接使用Qt直接操作sql的各类功能。
2)使用Qt平台自带的Sqlite直接进行编程,操作简单。
3)利用Qt使用Excel进行数据的存储。
在以上选择中我使用了Sqlite数据库编程,因为是Qt平台支持的Sqlite相对于其他两种较为简单,在测试数据库时,可使用Navicat Premium 15来进行本地数据库正确性的测试,如图:
剩下的就是对数据库进行增、删、查、改操作。
4.功能源代码解析:
//需要用到的头文件
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlQueryModel>
//变量声明
QSqlDatabase db;//建立和qt和数据库连接
QSqlQueryModel model;//保存和遍历select结果
QString tableName = "qTableInfo";//添加表格名称
//1.建立数据库
//建立和SQlite QSQLITE数据库连接
db = QSqlDatabase::addDatabase("QSQLITE");
//设置数据库文件的名称
db.setDatabaseName("schoolTestDB.db");
//打开数据库
if(db.open() == false){
QMessageBox::critical(this,"DataError",
db.lastError().text());
}
else {
}
//2.构建数据表
//构建创建表的SQL语句
QString createSql =
QString("CREATE TABLE %1(\
'课程编号' INT PRIMARY KEY NOT NULL,\
'课程名称' TEXT NOT NULL,\
'任课教师' TEXT NOT NULL,\
'学分' REAL NOT NULL,\
'课程性质' TEXT NOT NULL,\
'开课院系' TEXT NOT NULL)").arg(tableName);
QSqlQuery query;
query.exec(createSql);//用来提交数据给数据库创建表
//3.数据库查询 全局 查
//查询表
QString str = QString("SELECT * FROM %1").arg(tableName);
model.setQuery(str);
ui->sqlite_View->setModel(&model);//用来在ui界面显示数据库查询到的所有数据
//4.数据库增加数据 增
//添加数据
QSqlQuery query;
//获取课程编号
int cNum = ui->cNum_Edit->text().toInt();
//获取课程名
QString cName = ui->cName_Edit->text();
//获取老师姓名
QString tName = ui->tName_Edit->text();
//获取学分
double score = ui->scoreEdit->text().toDouble();
//课程性质
QString cNature = ui -> cb_cNature -> currentText();
//获取开课院系
QString schoolName = ui->school_cmb->currentText();
//构造sql语句
QString insertSql = QString(
"INSERT INTO %1 VALUES(%2,'%3','%4',%5,'%6','%7');"
).arg(tableName).arg(cNum).arg(cName).arg(tName).arg(score).arg(cNature).arg(schoolName);
//执行sql语句
query.exec(insertSql);
// commit 提交交事务 添加数据库数据必须使用commit 否则会出现添失效
query.exec("commit");
//5.数据库删除语句 删
//数据库删除数据
QSqlQuery query;
// 注意数据库操作时符号很重要,例如双引号变单引号就不行
//这里疑问keyId怎么获取,赋予view点击事件,当点击对应表格数据时就可以得到该行的全部数据
QString dropRowId = QString("delete from qTableInfo where 课程编号 = %1").arg(keyId);
//执行sql语句
query.exec(dropRowId);
//数据库模糊查询 模糊 查
//数据库模糊查询
QString selectInfo = QString("SELECT * FROM %1 WHERE %2 LIKE '%%3%'")
.arg(tableName).arg(columnName).arg(serachKey);
//% % 模糊查询
model.setQuery(selectInfo);
ui->cQueryView->setModel(&model);//回显到view页面
//6.数据库改数据 改
//修改数据库信息 主键 根据主键来修改
QSqlQuery query;
// 任课老师
QString tName = ui->tName_Edit->text();
// 学分
double score = ui->scoreEdit->text().toDouble();
// 课程名称
QString cName = ui->cName_Edit->text();
// 课程性质
QString cNature = ui->cb_cNature->currentText();
// 学校
QString scholl = ui->school_cmb->currentText();
//构造sql语句
QString updatatSql = QString(
"UPDATE %1 SET 课程名称 = '%2', 任课教师 = '%3', 学分 = %4, 课程性质 = '%5', 开课院系 = '%6' WHERE 课程编号 = %7"
).arg(tableName).arg(cName).arg(tName).arg(score).arg(cNature).arg(scholl).arg(sqlIdInfo);
//执行sql语句
query.exec(updatatSql);
//疑问 怎么点击后把一个窗口的数据带到另一个窗口
//解答 可以使用信号与槽来实现也可以通过全局变量来传递,这里选择全局变量
5.view数据怎么保存为Excel表格:
这里需要exportexcelobject.c和exportexcelobject.h文件加入工程才可以操作。
源码解析(这段代码为网上修改 不能保存第一行数据原因不知 有小伙伴知道的记得私聊或者评论):
// 获取弹出框输入文件名
QString fileName = QFileDialog::getSaveFileName(this, tr("Excel file"), qApp->applicationDirPath (),
tr("Excel Files (*.xls)"));
if (fileName.isEmpty())
return;
// 文件名,创建后的名字,数据源
ExportExcelObject obj(fileName, "infoData", ui->InfoView);
//这里有疑问,不能保存第一行数据原因不知 有小伙伴知道的记得私聊或者评论
// obj.addField(0, "课程编号", "char(20)");
obj.addField(1, "课程名称", "char(20)");
obj.addField(2, "任课老师", "char(20)");
obj.addField(3, "学分", "char(20)");
obj.addField(4, "课程性质", "char(20)");
obj.addField(5, "开课院系", "char(20)");
// 设置进度条
ui->progressBar->setValue(0);
ui->progressBar->setMaximum(ui->InfoView->model()->rowCount());
// 监听进度条变化
connect(&obj, SIGNAL(exportedRowCount(int)), ui->progressBar, SLOT(setValue(int)));
// 获取写入数据条数
int retVal = obj.export2Excel();
if( retVal > 0)
{
QMessageBox::information(this, tr("Done"),
QString(tr("%1 records exported!")).arg(retVal)
);
}
以上便是Qt对数据库Sqlite 增、删、查、改的基本操作以及对数据存储Excel的转换操作,有疑问的可以下载源码来进行查看。
源码地址:https://download.youkuaiyun.com/download/qq_43122582/21064541