【Qt初入江湖】Qt QSqlRelationalTableModel 底层架构、原理详细描述
  ez6gekIbtGV1 2023年11月19日 29 0


鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者 、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()等方法进行数据的修改、删除和插入等操作即可。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
ez6gekIbtGV1