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

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

时间:2023-11-10 11:34:11浏览次数:34  
标签:Qt 表格 QSqlRelationalTableModel 数据库 外键 初入 方法


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

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

 

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

Qt QSqlRelationalTableModel的底层架构和Qt QSqlTableModel类似,不同之处在于它还封装了对关联表格的查询和操作。Qt QSqlRelationalTableModel通过QSqlRelation类来描述数据库表格之间的关联关系。QSqlRelation封装了外键关系,它描述了两个表格之间的关联关系,并指定了外键的名称和关联表格的名称。

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

+-----------------------------+
|   QSqlRelationalTableModel  |
+-----------------------------+
| - db                        |
| - tableName                 |
| - filter                    |
| - sort                      |
| - limit                     |
| - offset                    |
| - relations                 |
| - relationModelCacheEnabled |
+-----------------------------+
          /_\
           |
           | 继承
           |
+-----------------------------+
|   QSqlTableModel            |
+-----------------------------+
| - relation                 |
| - relationColumn           |
+-----------------------------+
          /_\
           |
           | 实例化
           |
+-----------------------------+
|   QSqlRelationalTableModel  |
+-----------------------------+

在这个架构中,QSqlRelationalTableModel 类是对一个包含外键关系的数据库表格的抽象,它包含了与该表格相关的数据库连接、表名、筛选条件、排序方式、数据限制、外键关系等信息。QSqlTableModel 类是 QSqlRelationalTableModel 类的基类,它实现了在 Qt 模型/视图框架中使用数据库表格的基本功能。QSqlRelationalTableModel 类继承了 QSqlTableModel 类,并添加了一些用于编辑包含外键关系的数据的方法和信号。

在 QSqlRelationalTableModel 类中,外键关系是通过 QSqlRelation 对象来表示的。QSqlRelation 对象包含了一个外键列名、一个参考表格的名称、一个参考表格中的列名。QSqlRelation 对象的作用是将一个列的数据类型从一个简单的值转换为一个参考表格中的值。

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

  1. QSqlRelationalTableModel::setTable()

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

QSqlRelationalTableModel model;
model.setTable("mytable");
  1. QSqlRelationalTableModel::setRelation()

setRelation()方法用于设置表格的外键关系。例如:

model.setRelation(column, QSqlRelation("othertable", "id", "name"));
  1. QSqlRelationalTableModel::select()

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

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

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

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

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

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

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

model.removeRow(row);

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

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlRelationalTableModel>
#include <QSqlRelation>
#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";

        // 创建QSqlRelationalTableModel对象
        QSqlRelationalTableModel model;
        model.setTable("mytable");
        model.setRelation(1, QSqlRelation("othertable", "id", "name"));

        // 从数据库中获取表格数据
        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数据库连接,并设置了连接信息。然后创建了一个QSqlRelationalTableModel对象,并使用setTable()方法设置了要操作的数据库表格,使用setRelation()方法设置了表格的外键关系。接着使用select()方法从数据库中获取表格数据,并使用data()方法获取表格数据。然后使用setData()方法修改了表格数据,并使用submitAll()方法将修改提交到数据库。最后使用removeRow()方法删除了表格数据中的一行。

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

标签:Qt,表格,QSqlRelationalTableModel,数据库,外键,初入,方法
From: https://blog.51cto.com/chenfenglove/8294058

相关文章

  • 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框架,其事件循环实现原理......
  • QT代码实现将图片镜像翻转效果
    QT代码实现将图片镜像翻转效果将图片原图和镜像图合并输出,实现图片镜像功能快速显示效果在UI拖入一个QPushButton,一个QLabel用于缩放显示效果voidWidget::on_pushButton_clicked(){QStringpath=QDir::currentPath();//ui->m_fileEdit->setText(path);//打......