通过使用Qt中的数据库,实现对学生成绩的管理,包括成绩的增删改查以及排序等操作。
1、项目框架
2、UI界面设计
3、相关运行代码
StudentSystem.pro
QT += sql // 与数据库相关的模块
studentSystem.h 头文件
#ifndef STUDENTDIALOG_H
#define STUDENTDIALOG_H
#include <QDialog>
#include <QSqlDatabase> // 管理数据库连接的类
#include <QSqlQuery> // 执行SQL查询的类
#include <QSqlQueryModel> // 在Qt模型/视图框架中显示SQL查询结果的类
#include <QSqlError> // 于处理SQL相关错误的类
#include <QDebug>
#include <QMessageBox>
#include <QFile> // 提供了对文件的读取和写入操作
namespace Ui {a
class StudentDialog;
}
class StudentDialog : public QDialog
{
Q_OBJECT
public:
explicit StudentDialog(QWidget *parent = 0);
~StudentDialog();
private:
// 创建数据库
void createDB();
// 创建数据表
void createTable();
// 查询
void queryTable();
private slots:
// 插入按钮对应的槽函数
void on_insertButton_clicked();
// 删除按钮对应的槽函数
void on_deleteButton_clicked();
// 修改按钮对应的槽函数
void on_updateButton_clicked();
// 排序按钮对应的槽函数
void on_sortButton_clicked();
private:
Ui::StudentDialog *ui;
QSqlDatabase db; // 建立Qt和数据库链接
QSqlQueryModel model ; // 保存查询结果集
};
#endif // STUDENTDIALOG_H
studentSystem.h 源文件
#include "studentdialog.h"
#include "ui_studentdialog.h"
StudentDialog::StudentDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::StudentDialog)
{
ui->setupUi(this);
createDB();
createTable();
queryTable();
}
StudentDialog::~StudentDialog()
{
delete ui;
}
// 创建数据库
void StudentDialog::createDB()
{
// 检查数据库文件是否已经存在
if (QFile::exists("student.db"))
{
// 数据库文件已经存在,直接打开
db = QSqlDatabase::addDatabase("QSQLITE"); // 添加数据库驱动库
db.setDatabaseName("student.db"); // 设置数据库名字(文件名)
if (db.open())
{
qDebug() << "打开数据库成功!";
}
else
{
qDebug() << "打开数据库失败!";
}
}
else
{
// 数据库文件不存在,创建并打开
db = QSqlDatabase::addDatabase("QSQLITE"); // 添加数据库驱动库
db.setDatabaseName("student.db"); // 设置数据库名字(文件名)
if (db.open())
{
qDebug() << "创建/打开数据库成功!";
}
else
{
qDebug() << "创建/打开数据库失败!";
}
}
}
// 创建数据表
void StudentDialog::createTable()
{
QSqlQuery query;
QString selectsql = QString("select * from sqlite_master where name='student'"); //是否已经存在表
query.exec(selectsql);
if(query.next())
{
qDebug() << "数据表已经存在!";
}
else
{
QString str = QString("CREATE TABLE student ("
"id INT PRIMARY KEY NOT NULL,"
"name TEXT NOT NULL,"
"score REAL NOT NULL)");
// 判断表是否创建成功
if(query.exec(str) == false)
{
qDebug() << str ;
}
else
{
qDebug() << "创建数据表成功!";
}
}
}
// 查询
void StudentDialog::queryTable()
{
QString str = QString("SELECT * FROM student;");
if(str == "")
{
qDebug() << "表中没有任何的数据";
}
else
{
model.setQuery(str);
ui->tableView->setModel(&model);
}
}
// 插入按钮对应的槽函数
void StudentDialog::on_insertButton_clicked()
{
QSqlQuery query;
int id = ui->idEdit->text().toInt();
if(id <= 0)
{
QMessageBox::critical(this,"Error","ID输入错误!(id > 0)");
return;
}
QString name = ui->nameEdit->text();
if(name == "")
{
QMessageBox::critical(this,"Error","姓名输入错误!");
return;
}
double score = ui->scoreEdit->text().toDouble();
if(score < 0 || score > 100)
{
QMessageBox::critical(this,"Error","成绩输入错误!(0-100)");
return;
}
QString sql = QString("SELECT * from student WHERE id=%1;").arg(id);
query.prepare(sql);
query.bindValue(":id", id);
if (query.exec() && query.next())
{
QMessageBox::critical(this, "Error", "该用户id已经存在");
return ; // 存在该记录
}
QString str = QString("INSERT INTO student VALUES(%1,'%2', %3);"
).arg(id).arg(name).arg(score);
if(query.exec(str) == false)
{
qDebug() << str ;
}
else
{
queryTable();
QMessageBox::information(this, "success","插入操作成功!" ) ;
// qDebug() << "插入数据成功!";
}
}
// 删除按钮对应的槽函数: 根据ID删除一条数据
void StudentDialog::on_deleteButton_clicked()
{
QSqlQuery query;
int id = ui->idEdit->text().toInt();
if(id <= 0)
{
QMessageBox::critical(this, "error","请输入正确的id!" ) ;
return;
}
QString sql = QString("SELECT * from student WHERE id=%1;").arg(id);
query.prepare(sql);
query.bindValue(":id", id);
if (query.exec() && query.next())
{
QString str = QString("DELETE FROM student WHERE id = %1;").arg(id);
if(QMessageBox::question(this,"删除","确定要删除?",
QMessageBox::Yes|QMessageBox::No) == QMessageBox::No)
{
return;
}
if(query.exec(str) == false)
{
qDebug() << str ;
QMessageBox::critical(this, "Error", "删除失败");
}
else
{
queryTable();
QMessageBox::information(this, "success","删除操作成功!" ) ;
// qDebug() << "删除操作成功";
}
}
else
{
QMessageBox::critical(this, "Error", "该用户id不存在");
return ; // 不存在该记录
}
}
// 修改按钮对应的槽函数 : 根据ID修改成绩
void StudentDialog::on_updateButton_clicked()
{
QSqlQuery query;
int id = ui->idEdit->text().toInt();
if(id == 0)
{
QMessageBox::critical(this, "error","请输入正确的id!" ) ;
return;
// qDebug() << "请输入正确的id";
}
double score = ui->scoreEdit->text().toDouble();
if(score < 0 || score > 100)
{
QMessageBox::critical(this, "error","修改的成绩有误!(0-100)" ) ;
return;
// qDebug() << "修改的成绩有误!";
}
QString sql = QString("SELECT * from student WHERE id=%1;").arg(id);
query.prepare(sql);
query.bindValue(":id", id);
if (query.exec() && query.next())
{
QString str = QString("UPDATE student SET score=%1 WHERE id=%2;"
).arg(score).arg(id);
if(query.exec(str)==false)
{
qDebug() << str;
QMessageBox::critical(this, "Error", "修改失败");
}
else
{
queryTable();
QMessageBox::information(this, "success","修改操作成功!" ) ;
// qDebug() << "修改操作成功!";
}
}
else
{
QMessageBox::critical(this, "Error", "该用户id不存在");
return ; // 不存在该记录
}
}
// 排序按钮对应的槽函数
void StudentDialog::on_sortButton_clicked()
{
// 获取排序列名
QString value = ui->valueComboBox->currentText();
// 获取排序方式
QString condition;
if(ui->condComboBox->currentIndex() == 0)
{
condition = "ASC"; // 升序
}
else
{
condition = "DESC"; // 降序
}
QString str = QString("SELECT * FROM student ORDER BY %1 %2;"
).arg(value).arg(condition);
// 查询和显示
model.setQuery(str);
ui->tableView->setModel(&model);
QMessageBox::information(this, "success","排序成功!" ) ;
}
4、运行结果
对学生成绩进行查询 、添加、删除、修改以及排序等。有兴趣的还可以添加其他的功能。
未完待续
有疑问或者有更好的项目,小伙伴们可以留言一起交流讨论!!!