利用QSqlTableModel及QTableView实现数据库增删改及自定义sql操作

30 篇文章 4 订阅

QSqlTableModel是一个可以很方便实现数据库增删改,以及一些自定义sql操作的工具,尤其是数据库数据修改,利用QSqlTableModel+QTableView可以非常的方便且只管。

一、准备工作

1 创建QSqlDatabase

涉及的所有头文件:

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QCoreApplication>
#include <QDir>
#include <QMessageBox>
#include <QSqlTableModel>
#include <QSqlRecord>

声明:

QSqlDatabase *mQSqlDatabase=new QSqlDatabase(QSqlDatabase::addDatabase("QSQLITE","test_database"));

定义:

	//笔者使用的是qt自带的QSqlite,找到要打开的db文件
    QString path=QCoreApplication::applicationDirPath()+"/Data";
    QDir dir(path);
    if(!dir.exists()){
        dir.mkpath(path);
    }
    QString dbpath = path +"/database.db";
    mQSqlDatabase->setDatabaseName(dbpath);//如果没有这个数据库,则会创建
    if(!mQSqlDatabase->open()){
        QMessageBox::warning(this,"警告","数据库打开失败!");
    }

2 创建QSqlTableModel模型

声明:

QSqlTableModel* model;

定义:

	//将QSqlTableModel与QSqlDatabase绑定起来
    model = new QSqlTableModel(this,*mQSqlDatabase);
    model->setTable("test");
    model->setSort(1,Qt::DescendingOrder);//降序排列
    //下面这句很重要,设置数据库修改后保存的方式,默认应该是OnFieldChange,即编辑完就保存修改至数据库,OnManualSubmit是需要手动提交时
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    //刷新任务列表
    ui->tableView->setModel(model);
    ui->tableView->resizeColumnsToContents();//自动调整列宽
    ui->tableView->resizeRowsToContents();//自动调整行距
    ui->tableView->setAlternatingRowColors(true);//设置行间交叉颜色
    ui->tableView->setColumnHidden(0,true);//设置某一列不显示

3 创建表格

    if(!mQSqlDatabase->tables().contains("test")){
        bool si=query.exec("create table test(id integer Primary key,Code varchar(32))");
        if(!si){
            emit warnInfo("数据表创建失败!"+query.lastError().text());
        }
    }

二、实现数据库操作

1 增

    QSqlRecord record = model->record();
    //"filedName"就是列名,后面跟着的是相应的值
    record.setValue("filedName",ui->lineEdit->text());
    model->insertRecord(0,record);//每次都从第一列插入
    model->submitAll();//如果设置保存策略是OnManualSubmit,则需要每次都提交一次修改
    model->select();//每次对数据库有什么变动,都应该重新筛选一次,获取最新的数据

2 删

如果保存策略是OnManualSubmit

    int curRow=ui->tableView->currentIndex().row();
    model->removeRow(curRow);
    int ok=QMessageBox::warning(this,"确定?","删否?",QMessageBox::Yes,QMessageBox::No);
    if(ok==QMessageBox::Yes)
    {
        model->submitAll();//提交策略
    }else{
        model->revertAll();//回退,注意,只有在保存策略是OnManualSubmit时有用
    }
    model->select();

否则,应该这么写

    int curRow=ui->tableView->currentIndex().row();
    int ok=QMessageBox::warning(this,"确定?","删否?",QMessageBox::Yes,QMessageBox::No);
    if(ok==QMessageBox::Yes)
    {
    	model->removeRow(curRow);
        model->submitAll();//提交策略
    }
    model->select();

3 改

利用QSqlTableModel模型及QTableView模型,最方便的就是改的操作,直接可视化执行,然后保存即可。即在表格中直接修改,然后提交修改即可。
修改完后,如下提交:

    model->database().transaction();
    if(model->submitAll()){
        model->database().commit();
    }else{
        model->database().rollback();
        QString str;
        str += model->lastError().text();
        QMessageBox::warning(this,"error",str);
    }

4 带条件的筛选

如果是获取全部数据,则直接**model->select()**即可,但有时候只想要指定条件的内容,则可以使用

    QString find = QString("Code='%1'").arg(ui->Task_comboBox->currentText());
    model->setFilter(find);//添加筛选条件
    model->select();

5 自定义数据库操作

    QSqlQuery query(*mQSqlDatabase);
    int curRow = ui->tableView->currentIndex().row();
    QModelIndex index = ui->tableView->model()->index(curRow,0);
    QString id = ui->tableView->model()->data(index).toString();
    int tid = id.toInt();
    QString d = QString("delete from %1 where id = %2").arg("test").arg(tid);
    if(!query.exec(d)){
        QString str;
        str += query.lastError().text();
        QMessageBox::warning(this,"error",str);
    }

三、经验总结

  1. 一定要谨慎设置好**model->setEditStrategy(QSqlTableModel::OnManualSubmit)**这个保存策略,我一开始没指定submit才保存,所以每次删除后都无法回退revert。如果设置除此别的模式,那是不需要submit就能保存修改至数据库的。
  2. 使用QSqlRecord写入数据,相比较先插入一行,再写入数据等过程,简单很多。
  3. 一定要注意QSqlDatabase及QSqlTableModel的绑定。
  4. 创建QSqlDatabase时,注意QSqlDatabase(QSqlDatabase::addDatabase(“QSQLITE”,“test_database”));,最后面的"test_database"的内容,这是该数据库连接实例化的名称,不能重复。
  5. 可以使用QSqlTableModel的函数,也可以使用自定义的数据库语言操作。
  • 12
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼月半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值