首页 > 数据库 >【Qt初入江湖】Qt QSqlTableModel 底层架构、原理详细描述

【Qt初入江湖】Qt QSqlTableModel 底层架构、原理详细描述

时间:2023-11-10 13:02:52浏览次数:39  
标签:Qt 表格 数据库 +-----------------+ 初入 QSqlTableModel 方法


鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

【Qt初入江湖】Qt QSqlTableModel 底层架构、原理详细描述_数据库表

 

Qt QSqlTableModel是Qt中用于实现基于数据库表格的模型类,它继承自QAbstractTableModel。QSqlTableModel封装了对数据库表格的查询、修改、删除和插入等操作,可以很方便地与QTableView控件一起使用,用于显示和编辑数据库表格数据。在本文中,我们将详细介绍Qt QSqlTableModel的底层架构、原理和实现方法。

Qt QSqlTableModel的底层架构由以下几个部分组成:

  1. QSqlTableModelPrivate

QSqlTableModelPrivate是QSqlTableModel的私有实现类,它封装了对数据库表格的查询、修改、删除和插入等操作,以及对数据的缓存和更新。

  1. QSqlRecord

QSqlRecord是Qt中用于封装数据库表格记录的类,它封装了对表格记录的查询、修改和插入等操作。

  1. QSqlField

QSqlField是Qt中用于封装数据库表格字段的类,它封装了对表格字段的查询、修改和插入等操作。

下面是 QSqlTableModel 类的底层架构图:

+-----------------+
|   QSqlTableModel|
+-----------------+
| - db            |
| - tableName     |
| - filter        |
| - sort          |
| - limit         |
| - offset        |
+-----------------+
          /_\
           |
           | 继承
           |
+-----------------+
|   QSqlQueryModel|
+-----------------+
| - query         |
+-----------------+
          /_\
           |
           | 实例化
           |
+-----------------+
|   QSqlTableModel|
+-----------------+

在这个架构中,QSqlTableModel 类是对一个数据库表格的抽象,它包含了与该表格相关的数据库连接、表名、筛选条件、排序方式、数据限制等信息。QSqlQueryModel 类是 QSqlTableModel 类的基类,它实现了在 Qt 模型/视图框架中使用 SQL 查询结果的基本功能。QSqlTableModel 类继承了 QSqlQueryModel 类,并添加了一些用于编辑数据的方法和信号。QSqlTableModel 类实例化时会创建一个对应的 QSqlQuery 对象,用于实际执行 SQL 查询语句。

在Qt中,我们可以使用以下方法来操作QSqlTableModel:

  1. QSqlTableModel::setTable()

setTable()方法用于设置要操作的数据库表格。例如:

QSqlTableModel model;
model.setTable("mytable");
  1. QSqlTableModel::select()

select()方法用于从数据库中获取表格数据,并将其存储在QSqlTableModel对象中。例如:

if (model.select()) {
    // 处理查询结果
} else {
    qWarning() << "Failed to select data:" << model.lastError().text();
}
  1. QSqlTableModel::setData()

setData()方法用于设置表格中指定单元格的数据。例如:

model.setData(model.index(row, column), value);
  1. QSqlTableModel::submitAll()

submitAll()方法用于将对表格数据的修改提交到数据库中。例如:

if (!model.submitAll()) {
    qWarning() << "Failed to submit changes:" << model.lastError().text();
}
  1. QSqlTableModel::removeRow()

removeRow()方法用于从表格中删除指定行。例如:

model.removeRow(row);

下面是一个简单的Qt QSqlTableModel的实现示例,其中包含了上述方法的使用:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QSqlError>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 添加MySQL数据库连接
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("mydatabase");
    db.setUserName("myusername");
    db.setPassword("mypassword");

    // 打开数据库连接
    if (db.open()) {
        qInfo() << "Database connection opened";

        // 创建QSqlTableModel对象
        QSqlTableModel model;
        model.setTable("mytable");

        // 从数据库中获取表格数据
        if (model.select()) {
            // 处理查询结果
            for (int row = 0; row < model.rowCount(); ++row) {
                for (int column = 0; column < model.columnCount(); ++column) {
                    QVariant value = model.data(model.index(row, column));
                    qInfo() << "Row:" << row << "Column:" << column << "Value:" << value;
                }
            }

            // 修改表格数据
            model.setData(model.index(0, 0), "New Value");

            // 提交修改到数据库
            if (!model.submitAll()) {
                qWarning() << "Failed to submit changes:" << model.lastError().text();
            }
        } else {
            qWarning() << "Failed to select data:" << model.lastError().text();
        }

        // 关闭数据库连接
        db.close();
        qInfo() << "Database connection closed";
    } else {
        qWarning() << "Failed to open database connection:" << db.lastError().text();
    }

    return app.exec();
}

在上述示例中,我们首先使用addDatabase()方法添加了一个MySQL数据库连接,并设置了连接信息。然后创建了一个QSqlTableModel对象,并使用setTable()方法设置了要操作的数据库表格。接着使用select()方法从数据库中获取表格数据,并使用data()方法获取表格数据。然后使用setData()方法修改了表格数据,并使用submitAll()方法将修改提交到数据库。最后使用removeRow()方法删除了表格数据中的一行。

Qt QSqlTableModel提供了一种方便的方式来实现基于数据库表格的模型类,并可以很方便地与QTableView控件一起使用。我们只需要按照上述方法,设置要操作的数据库表格,从数据库中获取表格数据,然后使用setData()等方法进行数据的修改、删除和插入等操作即可。

标签:Qt,表格,数据库,+-----------------+,初入,QSqlTableModel,方法
From: https://blog.51cto.com/chenfenglove/8296209

相关文章

  • 【Qt初入江湖】Qt QSqlRelationalTableModel 底层架构、原理详细描述
    鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen) QtQSqlRelationalTableModel是Qt中用于实现具有关联表格的模型类,它继承自QSqlTableModel。QSqlRelationalTable......
  • docker mqtt搭建
    DockerMQTT搭建教程简介本文将教你如何使用Docker搭建MQTT服务器。首先,我们会介绍整个流程,并用表格展示具体步骤。然后,我们会详细说明每一步需要做什么,并提供相应的代码。流程概览以下是搭建DockerMQTT服务器的步骤概览:步骤 描述1.安装Docker 在主机上安装Docker引擎2.拉取M......
  • pyqt5-designer简单使用和代码简单说明
    学习pyqt,实际上主要是逐个学习ui组件。 1、designer的简单使用(1)创建窗口主要是QWidget类窗口和QMainWindow窗口的使用。后者支持窗口菜单栏的实现。(2)拖动(3)布局和预览(4)查看组件属性(5)对象名称和类的 2、简单的代码说明(1)窗口中的所有ui组件,是作为窗口对象的......
  • Qt - QWidget::setGeometry()不生效问题解决方案
    开发过程中经常碰到setGeometry()不生效的问题,发现只要在setGeometry()之前调用一下show()或者setVisible(true)就可以了!问题就出在setVisible(true)!!!setVisible()会判断当前控件的WA_WState_Created属性,意思就是看看控件是否已经创建了window,如果为没有创建,就调用create()方......
  • 初始 Qt
    认识Qt参考:【1】《Qt6C++开发指南》Qt简介很多刚接触Qt的开发者会认为Qt是一种编程语言,或者将Qt的集成开发环境(integrateddevelopmentenvironment,IDE)QtCreator当作Qt,这些理解是错误的。Qt实质上是用C++编写的大型类库,它为跨平台应用开发提供了一个完整的框架......
  • QT实现将截屏保存为图片实践
    QT代实现将截屏保存为图片实践使用QGuiApplication::primaryScreen()可以取得当前屏幕,取得将QScreen->grabWindow(0)存入QPixmap即可。这里可以看到QT的封装非常方便我们取得屏幕截图。 开始截屏按扭代码voidTestWidget::on_pushButton_clicked(){this->hide();//隐藏当前......
  • qt 配置文件 settings
     Qt如何读取和写入配置文件的数据呢?_qt配置文件读写-CSDN博客 这篇写的很好,照着做成功了,能读写配置文件配置文件的路径在构造函数中设置。Qt使用QSetting对ini配置文件进行读取和写入_.ini文件读写qsetting-CSDN博客......
  • PyQt5-如何设置应用和窗口的图标?控件的提示信息如何设置?
    (PyQt5-如何设置应用和窗口的图标?控件的提示信息如何设置?)1如何设置应用和窗口的图标?1.1导入需要的包QApplication类是PyQt5的应用程序类;QMainWindow类是一个主窗口类;QIcon类用于创建和管理图标;ctypes是python的一个函数库,提供和C语言兼容的数据类型,可以直接调用动态链接......
  • QT发起http/https请求
    示例1、在.pro工程描述文件中添加网络模块QT+=network2、示例代码#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include"ui_mainwindow.h"#include<QDebug>#include<QWidget>#include<QObject>#include<QHttpMultiPar......
  • Qt事件循环及QEventLoop的使用
    目录一、介绍二、QCoreApplication主事件循环三、事件循环的开启例一例二四、父子事件传递五、processEvents六、QEventLoop类七、事件循环的嵌套及QEventLoop模拟同步调用1、同步获取数据2、主线程等待3、对话框弹出一、介绍Qt作为一个跨平台的UI框架,其事件循环实现原理......