• Qt扫盲-QSqlTableModel理论总结


    一、概述

    QSqlTableModel是用于从单个表读写数据库记录的高级接口。它构建在较低级的QSqlQuery之上,可用于向QTableView
    等视图类提供数据。这个主要是对单表的操作,不仅可以读取数据,而且可以修改数据。

    在项目里面,我们比如要操作某一个最基础的配置表的数据,因为其他表是依赖这个表里面数据的索引,我们就需要修改这个配置表里的具体的字段数据,就需要用这个 QSqlTableModel 对单表进行修改。当然我们也可以把 数据库的视图当成一个表,用作显示也是可以的。

    二、使用

    1. 与 view 视图绑定

    QSqlTableModel *model = new QSqlTableModel(parentObject, database);
    model->setTable("employee");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    model->select();
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
    
    QTableView *view = new QTableView;
    view->setModel(model);
    view->hideColumn(0); // don't show the ID
    view->show();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我们设置了SQL 表的名称 和编辑策略,然后设置了显示在view头中的标签。和QSqlQueryModel,如果在没有定义头的显示内容,就会和数据库的字段显示一样的,编辑策略决定了用户在视图中所做的更改何时实际应用于数据库。可能的值有 OnFieldChange、OnRowChange 和 OnManualSubmit。

    2. 做中间层,不显示

    QSqlTableModel也可以通过编程方式访问数据库,而不需要将其绑定到视图,这样的好处是显而易见的,就是构造了一个中间层、避免直接与数据库对接,方便后期的维护之类的:
    在这里插入图片描述

    QSqlTableModel model;
    model.setTable("employee");
    model.select();
    int salary = model.record(4).value("salary").toInt();
    
    • 1
    • 2
    • 3
    • 4

    上面的代码片段从查询 SELECT * from employee 的结果集 里面的第4条记录提取工资字段。

    可以使用setFilter()设置过滤器,也可以使用setSort()修改排序顺序。

    最后,必须调用select()方法向模型中填充数据。

    tablemodel示例说明如何使用QSqlTableModel作为QTableView的数据源。

    QSqlTableModel 不直接支持外键。如果你想解析外键,可以使用QSqlRelationalTableModel和QSqlRelationalDelegate。

    三、常用函数

    因为在很多时候修改单表配置的时候需要对这个数据表经常删、改、增等操作。这个类也是提供了这些修改的接口。
    当然修改的数据结构都是以 QSqlRecord 为基础结构进行的,所以我们需要去查 QSqlRecord 是如何表示一条sql查询结果的记录就可以啦。

    • deleteRowFromTable(int row)
    • insertRowIntoTable(const QSqlRecord &values)
    • updateRowInTable(int row, const QSqlRecord &values)

    在修改好,如果需要手动提交、回滚到数据库中,就可以使用 下面的这些API即可

    回滚:

    • revert() override
    • revertAll()

    提交

    • submit() override
    • submitAll()
  • 相关阅读:
    pycharm打开远程宿主机或远程docker文件夹目录方法,以及设置代码同步
    Qt6.3.2下QChart的使用
    Notebook系列第10期:图像风格转换
    如何在虚拟机的Ubuntu22.04中设置静态IP地址
    RHCE---Linux的计划任务
    mysql命令行导入csv文件,涵盖各种报错解决(亲测)
    css定位及定位和浮动的区别
    从零开始,开发一个 Web Office 套件(15):拖动边框,平移编辑器
    verilog语言中条件编译ifdef的使用和例子
    Spring MVC中如何对异常进行处理呢?
  • 原文地址:https://blog.csdn.net/qq_43680827/article/details/133325398