En esta página

QSqlRelationalTableModel Class

La clase QSqlRelationalTableModel proporciona un modelo de datos editable para una única tabla de base de datos, con soporte de claves foráneas. Más...

Cabecera: #include <QSqlRelationalTableModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Sql)
target_link_libraries(mytarget PRIVATE Qt6::Sql)
qmake: QT += sql
Hereda: QSqlTableModel

Tipos Públicos

enum JoinMode { InnerJoin, LeftJoin }

Funciones Públicas

QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
virtual ~QSqlRelationalTableModel()
QSqlRelation relation(int column) const
virtual QSqlTableModel *relationModel(int column) const
void setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)
virtual void setRelation(int column, const QSqlRelation &relation)

Funciones Públicas Reimplementadas

virtual void clear() override
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
virtual bool select() override
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
virtual void setTable(const QString &table) override

Ranuras Públicas

virtual void revertRow(int row) override

Funciones Protegidas Reimplementadas

virtual bool insertRowIntoTable(const QSqlRecord &values) override
virtual QString orderByClause() const override
virtual QString selectStatement() const override
virtual bool updateRowInTable(int row, const QSqlRecord &values) override

Descripción Detallada

QSqlRelationalTableModel actúa como QSqlTableModel, pero permite establecer columnas como claves foráneas en otras tablas de la base de datos.

La captura de pantalla de la izquierda muestra un QSqlTableModel plano en un QTableView. Las claves foráneas (city y country) no se resuelven a valores legibles por humanos. La captura de pantalla de la derecha muestra un QSqlRelationalTableModel, con claves foráneas resueltas en cadenas de texto legibles por humanos.

El siguiente fragmento de código muestra cómo se configuró el QSqlRelationalTableModel:

    model->setTable("employee");

    model->setRelation(2, QSqlRelation("city", "id", "name"));
    model->setRelation(3, QSqlRelation("country", "id", "name"));

Las llamadas a la función setRelation() establecen una relación entre dos tablas. La primera llamada especifica que la columna 2 de la tabla employee es una clave externa que se asocia con el campo id de la tabla city, y que la vista debe presentar el campo name de city al usuario. La segunda llamada hace algo similar con la columna 3.

Si utilizas un QSqlRelationalTableModel de lectura-escritura, probablemente quieras utilizar QSqlRelationalDelegate en la vista. A diferencia del delegado por defecto, QSqlRelationalDelegate proporciona un combobox para campos que son claves foráneas en otras tablas. Para utilizar la clase, basta con llamar a QAbstractItemView::setItemDelegate() en la vista con una instancia de QSqlRelationalDelegate:

    std::unique_ptr<QTableView> view{new QTableView};
    view->setModel(model);
    view->setItemDelegate(new QSqlRelationalDelegate(view.get()));

El ejemplo relationaltablemodel ilustra cómo utilizar QSqlRelationalTableModel junto con QSqlRelationalDelegate para proporcionar tablas con soporte de claves foráneas.

El usuario puede editar una clave externa en una tabla relacional

Notas:

  • La tabla debe tener una clave primaria declarada.
  • La clave primaria de la tabla no puede contener una relación con otra tabla.
  • Si una tabla relacional contiene claves que hacen referencia a filas inexistentes en la tabla referenciada, las filas que contienen las claves no válidas no se expondrán a través del modelo. El usuario o la base de datos son responsables de mantener la integridad referencial.
  • Si el nombre de columna de visualización de una relación también se utiliza como nombre de columna en la tabla relacional, o si se utiliza como nombre de columna de visualización en más de una relación, se le asignará un alias. El alias es el nombre de la tabla de la relación, el nombre de la columna de visualización y un identificador único unido por un guión bajo (por ejemplo, nombre_tabla_nombre_columna_id). QSqlRecord::fieldName() devolverá el nombre de la columna con el alias. Todas las apariciones del nombre de columna de visualización duplicado se convierten en alias cuando se detecta la duplicación, pero no se convierte en alias ningún nombre de columna de la tabla principal. El alias no afecta a QSqlRelation, por lo que QSqlRelation::displayColumn() devolverá el nombre de columna de visualización original.
  • El nombre de la tabla de referencia tiene un alias. El alias es la palabra "relTblAl" y el índice de la columna relacionada unidos por un guión bajo (por ejemplo, relTblAl_2). El alias puede utilizarse para filtrar la tabla (Por ejemplo, setFilter("relTblAl_2='Oslo' OR relTblAl_3='USA'")).
  • Cuando se utiliza setData() el rol debe ser siempre Qt::EditRole, y cuando se utiliza data() el rol debe ser siempre Qt::DisplayRole.

Véase también QSqlRelation, QSqlRelationalDelegate, y Ejemplo de modelo de tabla relacional.

Documentación de tipos de miembros

enum QSqlRelationalTableModel::JoinMode

ConstanteValorDescripción
QSqlRelationalTableModel::InnerJoin0- Modo Inner join, devuelve filas cuando hay al menos una coincidencia en ambas tablas.
QSqlRelationalTableModel::LeftJoin1- Modo join izquierdo, devuelve todas las filas de la tabla izquierda (nombre_tabla1), incluso si no hay coincidencias en la tabla derecha (nombre_tabla2).

Véase también QSqlRelationalTableModel::setJoinMode().

Documentación de las funciones miembro

[explicit] QSqlRelationalTableModel::QSqlRelationalTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())

Crea un QSqlRelationalTableModel vacío y establece como padre parent y como conexión a la base de datos db. Si db no es válida, se utilizará la conexión a la base de datos por defecto.

[virtual noexcept] QSqlRelationalTableModel::~QSqlRelationalTableModel()

Destruye el objeto y libera los recursos asignados.

[override virtual] void QSqlRelationalTableModel::clear()

Reimplementa: QSqlTableModel::clear().

[override virtual] QVariant QSqlRelationalTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

Reimplementa: QSqlTableModel::data(const QModelIndex &index, int rol) const.

Véase también setData().

[override virtual protected] bool QSqlRelationalTableModel::insertRowIntoTable(const QSqlRecord &values)

Reimplementa: QSqlTableModel::insertRowIntoTable(const QSqlRecord &values).

[override virtual protected] QString QSqlRelationalTableModel::orderByClause() const

Reimplementa: QSqlTableModel::orderByClause() const.

QSqlRelation QSqlRelationalTableModel::relation(int column) const

Devuelve la relación para la columna column, o una relación inválida si no se establece ninguna relación.

Véase también setRelation() y QSqlRelation::isValid().

[virtual] QSqlTableModel *QSqlRelationalTableModel::relationModel(int column) const

Devuelve un objeto QSqlTableModel para acceder a la tabla para la que column es una clave ajena, o nullptr si no hay relación para la column dada.

El objeto devuelto es propiedad de QSqlRelationalTableModel.

Véase también setRelation() y relation().

[override virtual] bool QSqlRelationalTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

Reimplementa: QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent).

[override virtual slot] void QSqlRelationalTableModel::revertRow(int row)

Reimplementa: QSqlTableModel::revertRow(int fila).

[override virtual] bool QSqlRelationalTableModel::select()

Reimplementa: QSqlTableModel::select().

[override virtual protected] QString QSqlRelationalTableModel::selectStatement() const

Reimplementa: QSqlTableModel::selectStatement() const.

[override virtual] bool QSqlRelationalTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

Reimplementa: QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role).

Establece los datos para el role en el elemento con el index especificado al value dado. Dependiendo de la estrategia de edición, el valor puede ser aplicado a la base de datos de una vez, o puede ser almacenado en caché en el modelo.

Devuelve true si el valor se pudo establecer, o false en caso de error (por ejemplo, si index está fuera de los límites).

Para columnas relacionales, value debe ser el índice, no el valor de visualización. Si se da un índice, también debe existir en la tabla referenciada, de lo contrario la función devuelve false. Si se pasa una QVariant() en lugar de un índice, éste se borra.

Véase también editStrategy(), data(), submit() y revertRow().

void QSqlRelationalTableModel::setJoinMode(QSqlRelationalTableModel::JoinMode joinMode)

Establece el SQL joinMode para mostrar u ocultar filas con claves foráneas NULL. En el modo InnerJoin (el predeterminado) estas filas no se mostrarán: utilice el modo LeftJoin si desea mostrarlas.

Ver también QSqlRelationalTableModel::JoinMode.

[virtual] void QSqlRelationalTableModel::setRelation(int column, const QSqlRelation &relation)

Permite que el column especificado sea un índice ajeno especificado por relation.

Ejemplo:

    model->setTable("employee");

    model->setRelation(2, QSqlRelation("city", "id", "name"));

La llamada a setRelation() especifica que la columna 2 de la tabla employee es una clave foránea que se asocia con el campo id de la tabla city, y que la vista debe presentar al usuario el campo name de city.

Nota: La clave primaria de la tabla no puede contener una relación con otra tabla.

Véase también relation().

[override virtual] void QSqlRelationalTableModel::setTable(const QString &table)

Reimplementa: QSqlTableModel::setTable(const QString &tableName).

[override virtual protected] bool QSqlRelationalTableModel::updateRowInTable(int row, const QSqlRecord &values)

Reimplementa: QSqlTableModel::updateRowInTable(int fila, const QSqlRecord &valores).

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.