本项目以及配套数据库已经上传到优快云,大家可根据需要下载:
- 项目
https://download.youkuaiyun.com/download/qq_41544842/14934412 - 数据库
https://download.youkuaiyun.com/download/qq_41544842/14934435
界面参考

界面中用到了Tab Widget 和Group Box(方便将查询那一坨作为整体一起移动),Tab Widget中放入TableView组件。
!!!注意,界面上的“确认添加”,“提交修改”按钮并非必需,只有将model的保存策略(下文代码中将提到)设置为手动提交时,才需要添加这些按钮。
显示数据库表格
通过使用QSqlTableModel类,可以省略一些SQL语言,十分简便地操作数据库。在下面的增删改查中,以books表为例子讲解,users表的操作同理。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle(QStringLiteral("多功能书籍管理系统"));
model = new QSqlTableModel(this);//这里记得在对应的头文件中进行声明
model->setTable("books");//显示数据库中的books表
//model->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置保存策略为手动提交
model->select();
model2 = new QSqlTableModel(this);
model2->setTable("users");
//model2->setEditStrategy(QSqlTableModel::OnManualSubmit);//设置保存策略为手动提交
model2->select();
setTitle();
}
void MainWindow::setTitle()
{//添加表格的标题
model->setHeaderData(0,Qt::Horizontal, "序号");
model->setHeaderData(1,Qt::Horizontal, "书籍名称");
model->setHeaderData(2,Qt::Horizontal, "书籍作者");
model->setHeaderData(3,Qt::Horizontal, "书籍类别");
model->setHeaderData(4,Qt::Horizontal, "书籍出版时间");
model->setHeaderData(5,Qt::Horizontal, "书籍出版社");
model->setHeaderData(6,Qt::Horizontal, "书籍摘要");
model->setHeaderData(7,Qt::Horizontal, "书籍借还状态");
model2->setHeaderData(0,Qt::Horizontal, "序号");
model2->setHeaderData(1,Qt::Horizontal, "用户证号");
model2->setHeaderData(2,Qt::Horizontal, "用户密码");
model2->setHeaderData(3,Qt::Horizontal, "用户姓名");
model2->setHeaderData(4,Qt::Horizontal, "用户性别");
model2->setHeaderData(5,Qt::Horizontal, "用户学院");
model2->setHeaderData(6,Qt::Horizontal, "用户年级");
model2->setHeaderData(7,Qt::Horizontal, "用户警告状态");
}
增
void MainWindow::on_addButton_clicked()//对应按钮“添加记录”
{
//在界面表格中添加了一条空行
//当没有设置保存策略为手动提交时,在表格中直接输入数据后打回车即可完成“增”,这时候查看数据库,发现已经新增了一条数据
int rowNum = model->rowCount();
model->insertRows(rowNum,1);
}
void MainWindow::on_checkaddButton_clicked()//对应按钮“确认添加”
{//设置保存策略为手动提交后,需要再添加这个按钮,进行下面的操作,才能将改变提交到数据库,否则,数据库不会做出任何改变
int rowNum = model->rowCount();
model->setData(model->index(rowNum,0),rowNum+1);
if(model->submitAll()){
model->database().commit();
QMessageBox::information(NULL,"添加成功","添加成功!");
}
else{
model->database().rollback();
QMessageBox::warning(this, tr("数据库错误"),
tr("数据库错误!"));
}
}
删
void MainWindow::on_deleteButton_clicked()
{
int curRow = ui->tableView->currentIndex().row();
QString status=model->data(model->index(curRow,7)).toString();//直接获取表格选中行中的status(第7列)
if(status=="未借出"){//注意在删除书籍时还需要判断书籍是否借出,只有未借出的书籍才能在数据库中进行删除
model->removeRow(curRow);//删除选中行
int ok = QMessageBox::warning(this,tr("删除当前行!"),
tr("你确定删除当前行吗? "),QMessageBox::Yes, QMessageBox::No);
if(ok == QMessageBox::No)
{
model->revertAll();//回滚操作,不会删除数据
} else {
if(model->submitAll()){//保存所有更改
QMessageBox::information(this, "删除成功","删除成功");
}
else{
QMessageBox::warning(this, tr("数据库错误"),tr("数据库错误!"));
}
}
}
else{
QMessageBox::warning(NULL,"删除失败","该书籍已被借出,不能删除!");
}
}
改
void MainWindow::on_updateButton_clicked()
{//当没有设置保存策略为手动提交时,在表格中直接修改数据后打回车即可完成“改”,这时候查看数据库,发现数据已经被修改,这一坨代码根本不用写。
//设置保存策略为手动提交后,需要再添加“提交修改”按钮,进行下面的操作,才能将改变提交到数据库,否则,数据库不会做出任何改变
model->database().transaction();
if(model->submitAll()){
model->database().commit();
QMessageBox::information(NULL,"修改成功","修改成功!");
}
else{
model->database().rollback();
QMessageBox::warning(this, tr("数据库错误"),
tr("数据库错误!"));
}
}
查
void MainWindow::on_searshButton_clicked()
{
QString name = ui->lineEdit_7->text();
QString author=ui->lineEdit_8->text();
QSqlQuery query;//复习:一个操作数据库的工具
int count=0,count2=0;
//判断输入情况,是否为空
if(name.length()!=0&&author.length()==0){
//采用的模糊查询,只要结果包含输入,就会被查出来
model->setFilter(QString("name like '%%1%'").arg(name));//一个舍去了“select”关键词的筛选函数
model->select();
QString sql=QString("select * from books where name like '%%1%'").arg(name);//复习:写出SQL语句
query.exec(sql);//复习:执行这条SQL语句
while(query.next())//复习:循环查询结果集,进行一系列操作
{
count++;//对查询结果计数
if(query.value(7).toString()=="未借出"){
count2++;//对在馆数量计数
}
}
//这里要进行类型的转换,把int转化为QString,因为label\lineEdit这种都默认显示QString类型的数据
QString str_count=QString::number(count);
QString str_count2=QString::number(count2);
ui->label_4->setText(str_count);
ui->label_5->setText(str_count2);
}else if(author.length()!=0&&name.length()==0){
//以下同理
model->setFilter(QString("author like '%%2%'").arg(author));
model->select();
QString str_count=QString::number(count);
QString str_count2=QString::number(count2);
ui->label_4->setText(str_count);
ui->label_5->setText(str_count2);
}else if(name.length()!=0&&author.length()!=0){
model->setFilter(QString("name like '%%1%' && author like '%%2%'").arg(name).arg(author));
model->select();
QString sql=QString("select * from books where name like '%%1%'&& author like '%%2%'").arg(name).arg(author);
query.exec(sql);
while(query.next())
{
count++;
if(query.value(7).toString()=="未借出"){
count2++;
}
}
QString str_count=QString::number(count);
QString str_count2=QString::number(count2);
ui->label_4->setText(str_count);
ui->label_5->setText(str_count2);
}
else{
QMessageBox::warning(this, tr("Warning"),tr("不能两者都为空") );
}
}
刷新
void MainWindow::on_showallButton_clicked()
{//刷新就是把表格重新显示一遍
model->setTable("books");
setTitle();
model->select();
}
至此,我们就实现了使用QT+MySQL对数据库的数据进行增删改查。下一章介绍用户借书与还书。有任何问题欢迎评论~ 如果这篇文章有帮你的话不妨点个赞~