2024年Qt数据库(六)QSqlTableModel_qsqltablemodel onmanualsubmit,2024年最新C C++程序员必经的实践之路

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

本文章原创于www.yafeilinux.com 转载请注明出处。

在上一篇我们讲到只读的QSqlQueryModel也可以使其可编辑,但是很麻烦。Qt提供了操作单表的QSqlTableModel,如果我们需要对表的内容进行修改,那么我们就可以直接使用这个类。

QSqlTableModel,该类提供了一个可读写单张SQL表的可编辑数据模型。我们下面就对其的几个常用功能进行介绍,分别是修改,插入,删除,查询,和排序。

在开始讲之前,我们还是新建Qt4 Gui Application工程,我这里工程名为tableModel ,然后选中QtSql模块,Base class选QWidget。工程建好后,添加C++ Header File ,命名为database.h,更改其内容如下:

#ifndef DATABASE_H
#define DATABASE_H

#include
#include
#include
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);
    db.setDatabaseName(“database.db”);
    if(!db.open()) return false;
    QSqlQuery query;
    query.exec(QObject::tr(“create table student (id int primary key, name vchar)”));
    query.exec(QObject::tr(“insert into student values (0,’刘明’)”));
    query.exec(QObject::tr(“insert into student values (1,’陈刚’)”));
    query.exec(QObject::tr(“insert into student values (2,’王红’)”));
    return true;
}

#endif // DATABASE_H

为了在数据库中能使用中文,我们使用了QObject类的tr()函数。而在下面的main()函数中我们也需要添加相应的代码来支持中文。

然后将main.cpp的文件更改如下:

#include <QtGui/QApplication>
#include “widget.h”
#include “database.h”
#include
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    if(!createConnection())
        return 1;
    Widget w;
    w.show();
    return a.exec();
}

下面我们打开widget.ui,设计界面如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中的部件有Table View 和 Line Edit,其余是几个按钮部件。

然后在widget.h中加入头文件: #include

在private中声明对象:QSqlTableModel *model;

因为我们要在不同的函数中使用model对象,所以我们在这里声明它。

我们到widget.cpp文件中的构造函数里添加如下代码:

model = new QSqlTableModel(this);
model->setTable(“student”);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select(); //选取整个表的所有行
// model->removeColumn(1); //不显示name属性列,如果这时添加记录,则该属性的值添加不上
ui->tableView->setModel(model);
// ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);   //使其不可编辑

此时运行程序,效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到,这个模型已经完全脱离了SQL语句,我们只需要执行select()函数就能查询整张表。上面有两行代码被注释掉了,你可以取消注释,测试一下它们的作用。

第一,修改操作。

1.我们进入“提交修改”按钮的单击事件槽函数,修改如下:

void Widget::on_pushButton_clicked() //提交修改
{
    model->database().transaction(); //开始事务操作
    if (model->submitAll()) {
        model->database().commit(); //提交
    } else {
        model->database().rollback(); //回滚
        QMessageBox::warning(this, tr(“tableModel”),
                             tr(“数据库错误: %1″)
                             .arg(model->lastError().text()));
    }
}

这里用到了事务操作,真正起提交操作的是model->submitAll()一句,它提交所有更改。

2.进入“撤销修改”按钮单击事件槽函数,并更改如下:

void Widget::on_pushButton_2_clicked() //撤销修改
{
     model->revertAll();
}

它只有简单的一行代码。

我们需要在widget.cpp文件中添加头文件:

#include
#include

此时运行程序,效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将“陈刚”改为“李强”,如果我们点击“撤销修改”,那么它就会重新改为“陈刚”,而当我们点击“提交修改”后它就会保存到数据库,此时再点击“撤销修改”就修改不回来了。

可以看到,这个模型可以将所有修改先保存到model中,只有当我们执行提交修改后,才会真正写入数据库。当然这也是因为我们在最开始设置了它的保存策略:

model->setEditStrategy(QSqlTableModel::OnManualSubmit);

OnManualSubmit表明我们要提交修改才能使其生效。

第二,查询操作。

1.我们进入“查询”按钮的单击事件槽函数,更改如下:

void Widget::on_pushButton_7_clicked() //查询
{
    QString name = ui->lineEdit->text();
    model->setFilter(QObject::tr(“name = ‘%1′”).arg(name)); //根据姓名进行筛选
    model->select(); //显示结果
}

我们使用setFilter()函数进行关键字筛选,这个函数是对整个结果集进行查询。为了使用变量,我们使用了QObject类的tr()函数。

2.我们进入“返回全表”按钮的单击事件槽函数,更改如下:

void Widget::on_pushButton_8_clicked() //返回全表
{

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值