[Qt entró por primera vez en ríos y lagos] Descripción detallada del principio y la arquitectura subyacente de Qt QSqlRelationalTableModel

Yuxian: socio de contenido de CSDN, nuevo mentor estrella de CSDN, creador estrella creativo de pila completa, 51CTO (celebridad destacada + blogger experto), entusiasta del código abierto de github (desarrollo secundario de código fuente go-zero, arquitectura back-end de juegos https: https:/ /github.com/Peakchen)

 

Qt QSqlRelationalTableModel es una clase de modelo utilizada para implementar tablas asociadas en Qt, que hereda de QSqlTableModel. QSqlRelationalTableModel encapsula operaciones como consultar, modificar, eliminar e insertar tablas asociadas a la base de datos, y puede usarse fácilmente con el control QTableView para mostrar y editar datos de tablas asociadas. En este artículo, presentaremos en detalle la arquitectura subyacente, los principios y los métodos de implementación de Qt QSqlRelationalTableModel.

La arquitectura subyacente de Qt QSqlRelationalTableModel es similar a la de Qt QSqlTableModel, excepto que también encapsula consultas y operaciones en tablas asociadas. Qt QSqlRelationalTableModel describe la relación entre tablas de bases de datos a través de la clase QSqlRelation. QSqlRelation encapsula la relación de clave externa, que describe la relación entre dos tablas y especifica el nombre de la clave externa y el nombre de la tabla asociada.

El siguiente es el diagrama de arquitectura subyacente de la clase QSqlRelationalTableModel:

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

En esta arquitectura, la clase QSqlRelationalTableModel es una abstracción de una tabla de base de datos que contiene relaciones de clave externa, que contiene información como conexiones de bases de datos, nombres de tablas, condiciones de filtrado, métodos de clasificación, restricciones de datos y relaciones de clave externa relacionadas con la tabla. La clase QSqlTableModel es la clase base de la clase QSqlRelationalTableModel, que implementa las funciones básicas del uso de tablas de bases de datos en el marco de modelo/vista Qt. La clase QSqlRelationalTableModel hereda la clase QSqlTableModel y agrega algunos métodos y señales para editar datos que contienen relaciones de clave externa.

En la clase QSqlRelationalTableModel, las relaciones de clave externa están representadas por objetos QSqlRelation. Un objeto QSqlRelation contiene un nombre de columna de clave externa, un nombre de tabla de referencia y un nombre de columna de tabla de referencia. El propósito de un objeto QSqlRelation es convertir el tipo de datos de una columna de un valor simple a un valor en una tabla de referencia.

En Qt, podemos usar los siguientes métodos para manipular QSqlRelationalTableModel:

  1. QSqlRelationalTableModel::setTable()

El método setTable() se utiliza para configurar la tabla de la base de datos que se va a operar. Por ejemplo:

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

El método setRelation() se utiliza para establecer la relación de clave externa de la tabla. Por ejemplo:

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

El método select() se utiliza para obtener datos de la tabla de la base de datos y almacenarlos en el objeto QSqlRelationalTableModel. Por ejemplo:

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

El método setData() se utiliza para configurar los datos de la celda especificada en la tabla. Por ejemplo:

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

El método submitAll() se utiliza para enviar cambios en los datos de la tabla a la base de datos. Por ejemplo:

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

El método removeRow() se utiliza para eliminar la fila especificada de la tabla. Por ejemplo:

model.removeRow(row);

El siguiente es un ejemplo simple de implementación de Qt QSqlRelationalTableModel, que incluye el uso de los métodos anteriores:

#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();
}

En el ejemplo anterior, primero usamos el método addDatabase() para agregar una conexión de base de datos MySQL y configurar la información de conexión. Luego cree un objeto QSqlRelationalTableModel y use el método setTable () para configurar la tabla de la base de datos que se operará, y use el método setRelation () para establecer la relación de clave externa de la tabla. Luego use el método select() para obtener los datos de la tabla de la base de datos y use el método data() para obtener los datos de la tabla. Luego use el método setData() para modificar los datos de la tabla y use el método submitAll() para enviar los cambios a la base de datos. Finalmente, se elimina una fila de los datos de la tabla utilizando el método removeRow().

Qt QSqlRelationalTableModel proporciona una manera conveniente de implementar clases de modelo con tablas asociadas y se puede usar fácilmente con el control QTableView. Solo necesitamos configurar la tabla de la base de datos y la relación de clave externa para que se operen de acuerdo con el método anterior, obtener datos de la tabla de la base de datos y luego usar setData () y otros métodos para modificar, eliminar e insertar datos.

Supongo que te gusta

Origin blog.csdn.net/feng1790291543/article/details/131807684
Recomendado
Clasificación