QSqlTableModel Class
La clase QSqlTableModel proporciona un modelo de datos editable para una única tabla de base de datos. Más...
| Cabecera: | #include <QSqlTableModel> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Sql)target_link_libraries(mytarget PRIVATE Qt6::Sql) |
| qmake: | QT += sql |
| Hereda: | QSqlQueryModel |
| Heredado por: |
- Lista de todos los miembros, incluyendo los heredados
- QSqlTableModel es parte de Clases de Base de Datos.
Tipos Públicos
| enum | EditStrategy { OnFieldChange, OnRowChange, OnManualSubmit } |
Funciones Públicas
| QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase()) | |
| virtual | ~QSqlTableModel() |
| QSqlDatabase | database() const |
| QSqlTableModel::EditStrategy | editStrategy() const |
| int | fieldIndex(const QString &fieldName) const |
| QString | filter() const |
| bool | insertRecord(int row, const QSqlRecord &record) |
| bool | isDirty(const QModelIndex &index) const |
| bool | isDirty() const |
| QSqlIndex | primaryKey() const |
| QSqlRecord | record() const |
| QSqlRecord | record(int row) const |
| virtual void | revertRow(int row) |
| virtual void | setEditStrategy(QSqlTableModel::EditStrategy strategy) |
| virtual void | setFilter(const QString &filter) |
| bool | setRecord(int row, const QSqlRecord &values) |
| virtual void | setSort(int column, Qt::SortOrder order) |
| virtual void | setTable(const QString &tableName) |
| QString | tableName() const |
Funciones Públicas Reimplementadas
| virtual void | clear() override |
| virtual bool | clearItemData(const QModelIndex &index) override |
| virtual QVariant | data(const QModelIndex &index, int role = Qt::DisplayRole) const override |
| virtual Qt::ItemFlags | flags(const QModelIndex &index) const override |
| virtual QVariant | headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override |
| virtual bool | insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override |
| virtual bool | removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override |
| virtual bool | removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override |
| virtual int | rowCount(const QModelIndex &parent = QModelIndex()) const override |
| virtual bool | setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override |
| virtual void | sort(int column, Qt::SortOrder order) override |
Ranuras Públicas
| virtual void | revert() override |
| void | revertAll() |
| virtual bool | select() |
| virtual bool | selectRow(int row) |
| virtual bool | submit() override |
| bool | submitAll() |
Señales
| void | beforeDelete(int row) |
| void | beforeInsert(QSqlRecord &record) |
| void | beforeUpdate(int row, QSqlRecord &record) |
| void | primeInsert(int row, QSqlRecord &record) |
Funciones protegidas
| virtual bool | deleteRowFromTable(int row) |
| virtual bool | insertRowIntoTable(const QSqlRecord &values) |
| virtual QString | orderByClause() const |
| QSqlRecord | primaryValues(int row) const |
| virtual QString | selectStatement() const |
| void | setPrimaryKey(const QSqlIndex &key) |
| virtual bool | updateRowInTable(int row, const QSqlRecord &values) |
Funciones protegidas reimplementadas
| virtual QModelIndex | indexInQuery(const QModelIndex &item) const override |
Descripción Detallada
QSqlTableModel es una interfaz de alto nivel para leer y escribir registros de base de datos desde una única tabla. Se construye sobre el nivel inferior QSqlQuery y puede utilizarse para proporcionar datos a clases de vista como QTableView. Por ejemplo:
QSqlTableModel *model = new QSqlTableModel; model->setTable("employee"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->select(); model->setHeaderData(0, Qt::Horizontal, tr("Name")); model->setHeaderData(1, Qt::Horizontal, tr("Salary")); QTableView *view = new QTableView; view->setModel(model); view->hideColumn(0); // don't show the ID view->show();
Establecemos el nombre de la tabla SQL y la estrategia de edición, luego configuramos las etiquetas que se muestran en la cabecera de la vista. La estrategia de edición dicta cuándo se aplican realmente a la base de datos los cambios realizados por el usuario en la vista. Los valores posibles son OnFieldChange, OnRowChange, y OnManualSubmit.
QSqlTableModel también se puede utilizar para acceder a una base de datos mediante programación, sin vincularla a una vista:
QSqlTableModel model; model.setTable("employee"); model.select(); int salary = model.record(4).value("salary").toInt();
El fragmento de código anterior extrae el campo salary del registro 4 del conjunto de resultados de la consulta SELECT * from employee.
Es posible establecer filtros utilizando setFilter(), o modificar el orden de clasificación utilizando setSort(). Al final, debe llamar a select() para rellenar el modelo con datos.
El ejemplo tablemodel ilustra cómo utilizar QSqlTableModel como fuente de datos para un QTableView.
QSqlTableModel no proporciona soporte directo para claves foráneas. Utilice QSqlRelationalTableModel y QSqlRelationalDelegate si desea resolver claves externas.
Ver también QSqlRelationalTableModel, QSqlQuery, Programación Modelo/Vista, Ejemplo de Modelo de Tabla, y Tabla SQL en Caché.
Documentación de Tipos de Miembros
enum QSqlTableModel::EditStrategy
Este tipo enum describe qué estrategia elegir al editar valores en la base de datos.
| Constante | Valor | Descripción |
|---|---|---|
QSqlTableModel::OnFieldChange | 0 | Todos los cambios en el modelo se aplicarán inmediatamente a la base de datos. |
QSqlTableModel::OnRowChange | 1 | Los cambios en una fila se aplicarán cuando el usuario seleccione una fila diferente. |
QSqlTableModel::OnManualSubmit | 2 | Todos los cambios se almacenarán en caché en el modelo hasta que se llame a submitAll() o revertAll(). |
Nota: Para evitar la inserción de filas parcialmente inicializadas en la base de datos, OnFieldChange se comportará como OnRowChange para las filas recién insertadas.
Véase también setEditStrategy().
Documentación de las funciones miembro
[explicit] QSqlTableModel::QSqlTableModel(QObject *parent = nullptr, const QSqlDatabase &db = QSqlDatabase())
Crea un QSqlTableModel 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.
La estrategia de edición por defecto es OnRowChange.
[virtual noexcept] QSqlTableModel::~QSqlTableModel()
Destruye el objeto y libera los recursos asignados.
[signal] void QSqlTableModel::beforeDelete(int row)
Esta señal es emitida por deleteRowFromTable() antes de que se elimine el row de la tabla de base de datos activa en ese momento.
[signal] void QSqlTableModel::beforeInsert(QSqlRecord &record)
Esta señal es emitida por insertRowIntoTable() antes de que se inserte una nueva fila en la tabla de la base de datos activa en ese momento. Los valores que están a punto de insertarse se almacenan en record y pueden modificarse antes de que se inserten.
[signal] void QSqlTableModel::beforeUpdate(int row, QSqlRecord &record)
Esta señal es emitida por updateRowInTable() antes de que row se actualice en la tabla de la base de datos actualmente activa con los valores de record.
Tenga en cuenta que sólo se actualizarán los valores marcados como generados. La bandera generada puede establecerse con QSqlRecord::setGenerated() y comprobarse con QSqlRecord::isGenerated().
Véase también QSqlRecord::isGenerated().
[override virtual] void QSqlTableModel::clear()
Reimplementa: QSqlQueryModel::clear().
[override virtual] bool QSqlTableModel::clearItemData(const QModelIndex &index)
Reimplementa: QAbstractItemModel::clearItemData(const QModelIndex &index).
[override virtual] QVariant QSqlTableModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
Reimplementa: QSqlQueryModel::data(const QModelIndex &item, int role) const.
Véase también setData().
QSqlDatabase QSqlTableModel::database() const
Devuelve la conexión a la base de datos del modelo.
[virtual protected] bool QSqlTableModel::deleteRowFromTable(int row)
Elimina la dirección row de la tabla de base de datos activa en ese momento.
Este es un método de bajo nivel que opera directamente sobre la base de datos y no debe ser llamado directamente. Utilice removeRow() o removeRows() para eliminar valores. El modelo decidirá en función de su estrategia de edición cuándo modificar la base de datos.
Devuelve true si se ha borrado la fila; en caso contrario devuelve false.
Véase también removeRow() y removeRows().
QSqlTableModel::EditStrategy QSqlTableModel::editStrategy() const
Devuelve la estrategia de edición actual.
Véase también setEditStrategy().
int QSqlTableModel::fieldIndex(const QString &fieldName) const
Devuelve el índice del campo fieldName, o -1 si no existe el campo correspondiente en el modelo.
QString QSqlTableModel::filter() const
Devuelve el filtro configurado actualmente.
Véase también setFilter() y select().
[override virtual] Qt::ItemFlags QSqlTableModel::flags(const QModelIndex &index) const
Reimplementa: QAbstractTableModel::flags(const QModelIndex &index) const.
[override virtual] QVariant QSqlTableModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const
Reimplementa: QSqlQueryModel::headerData(int section, Qt::Orientation orientation, int role) const.
[override virtual protected] QModelIndex QSqlTableModel::indexInQuery(const QModelIndex &item) const
Reimplementa: QSqlQueryModel::indexInQuery(const QModelIndex &item) const.
Devuelve el índice del valor en el conjunto de resultados de la base de datos para el item dado en el modelo.
El valor devuelto es idéntico a item si no se han insertado, eliminado o movido columnas o filas.
Devuelve un índice de modelo no válido si item está fuera de los límites o si item no apunta a un valor en el conjunto de resultados.
Véase también QSqlQueryModel::indexInQuery().
bool QSqlTableModel::insertRecord(int row, const QSqlRecord &record)
Inserta el record en la posición row. Si row es negativo, el registro se añadirá al final. Llama internamente a insertRows() y setRecord().
Devuelve true si se pudo insertar el registro, en caso contrario false.
Los cambios se envían inmediatamente para OnFieldChange y OnRowChange. El fallo no deja una nueva fila en el modelo.
Véase también insertRows(), removeRows() y setRecord().
[virtual protected] bool QSqlTableModel::insertRowIntoTable(const QSqlRecord &values)
Inserta los valores values en la tabla de la base de datos activa en ese momento.
Este es un método de bajo nivel que opera directamente sobre la base de datos y no debe ser llamado directamente. Utilice insertRow() y setData() para insertar valores. El modelo decidirá en función de su estrategia de edición cuándo modificar la base de datos.
Devuelve true si se han podido insertar los valores, en caso contrario false. La información de error puede recuperarse con lastError().
Véase también lastError(), insertRow() y insertRows().
[override virtual] bool QSqlTableModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
Reimplementa: QAbstractItemModel::insertRows(int fila, int cuenta, const QModelIndex &parent).
Inserta count filas vacías en la posición row. Tenga en cuenta que parent no debe ser válido, ya que este modelo no admite relaciones padre-hijo.
Para las estrategias de edición OnFieldChange y OnRowChange, sólo se puede insertar una fila cada vez y el modelo no puede contener otros cambios almacenados en caché.
La señal primeInsert() se emitirá para cada nueva fila. Conéctese a ella si desea inicializar la nueva fila con valores por defecto.
No envía filas, independientemente de la estrategia de edición.
Devuelve false si los parámetros están fuera de los límites o no se puede insertar la fila; en caso contrario devuelve true.
Véase también primeInsert() y insertRecord().
bool QSqlTableModel::isDirty(const QModelIndex &index) const
Devuelve true si el valor en el índice index está sucio, en caso contrario false. Los valores sucios son valores que se han modificado en el modelo pero que aún no se han escrito en la base de datos.
Si index no es válido o apunta a una fila inexistente, se devuelve false.
bool QSqlTableModel::isDirty() const
Devuelve true si el modelo contiene valores modificados que no se han consignado en la base de datos; en caso contrario, devuelve false.
Se trata de una función sobrecargada.
[virtual protected] QString QSqlTableModel::orderByClause() const
Devuelve una cláusula SQL ORDER BY basada en el orden de clasificación establecido actualmente.
Véase también setSort() y selectStatement().
QSqlIndex QSqlTableModel::primaryKey() const
Devuelve la clave primaria de la tabla actual, o un QSqlIndex vacío si la tabla no está establecida o no tiene clave primaria.
Véase también setTable(), setPrimaryKey() y QSqlDatabase::primaryIndex().
[protected] QSqlRecord QSqlTableModel::primaryValues(int row) const
Devuelve un registro que contiene los campos representados en la clave primaria establecidos en los valores de row. Si no se define ninguna clave primaria, el registro devuelto contendrá todos los campos.
Véase también primaryKey().
[signal] void QSqlTableModel::primeInsert(int row, QSqlRecord &record)
Esta señal es emitida por insertRows(), cuando se inicia una inserción en el row dado de la tabla de base de datos actualmente activa. Se puede escribir en el parámetro record (ya que es una referencia), por ejemplo para rellenar algunos campos con valores por defecto y establecer las banderas generadas de los campos. No intente editar el registro por otros medios como setData() o setRecord() mientras maneja esta señal.
QSqlRecord QSqlTableModel::record() const
Se trata de una función sobrecargada.
Devuelve un registro vacío, que sólo contiene los nombres de los campos. Esta función puede utilizarse para recuperar los nombres de campo de un registro.
Véase también setRecord() y QSqlRecord::isEmpty().
QSqlRecord QSqlTableModel::record(int row) const
Devuelve el registro en row en el modelo.
Si row es el índice de una fila válida, el registro se rellenará con los valores de esa fila.
Si el modelo no está inicializado, se devolverá un registro vacío.
Véase también QSqlRecord::isEmpty().
[override virtual] bool QSqlTableModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())
Reimplementa: QSqlQueryModel::removeColumns(int columna, int cuenta, const QModelIndex &parent).
Elimina las columnas count del modelo parent, comenzando en el índice column.
Devuelve si las columnas se han eliminado correctamente; en caso contrario devuelve false.
Véase también removeRows().
[override virtual] bool QSqlTableModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
Reimplementa: QAbstractItemModel::removeRows(int fila, int cuenta, const QModelIndex &parent).
Elimina las filas de count empezando por row. Dado que este modelo no admite estructuras jerárquicas, parent debe ser un índice de modelo no válido.
Cuando la estrategia de edición es OnManualSubmit, la eliminación de filas de la base de datos se retrasa hasta que se llama a submitAll().
Para OnFieldChange y OnRowChange, sólo se puede borrar una fila a la vez y sólo si ninguna otra fila tiene un cambio almacenado en caché. Las supresiones se envían inmediatamente a la base de datos. El modelo conserva una fila en blanco para la fila eliminada correctamente hasta que se actualiza con select().
Tras un borrado fallido, la operación no se revierte en el modelo. La aplicación puede volver a enviarla o revertirla.
Las filas insertadas pero aún no enviadas con éxito en el rango que se va a eliminar se eliminan inmediatamente del modelo.
Antes de que se elimine una fila de la base de datos, se emite la señal beforeDelete().
Si fila < 0 o fila + count > rowCount(), no se realiza ninguna acción y se devuelve false. Devuelve true si se han podido eliminar todas las filas; en caso contrario, devuelve false. Se puede recuperar información detallada de errores de la base de datos utilizando lastError().
Véase también removeColumns() y insertRows().
[override virtual slot] void QSqlTableModel::revert()
Reimplementa: QAbstractItemModel::revert().
Este slot reimplementado es llamado por los delegados de ítems cuando el usuario cancela la edición de la fila actual.
Revierte los cambios si la estrategia del modelo es OnRowChange o OnFieldChange. No hace nada para la estrategia OnManualSubmit.
Utilice revertAll() para revertir todos los cambios pendientes para la estrategia OnManualSubmit o revertRow() para revertir una fila específica.
Véase también submit(), submitAll(), revertRow() y revertAll().
[slot] void QSqlTableModel::revertAll()
Revierte todos los cambios pendientes.
Véase también revert(), revertRow() y submitAll().
[virtual] void QSqlTableModel::revertRow(int row)
Revierte todos los cambios de la dirección row especificada.
Véase también revert(), revertAll(), submit() y submitAll().
[override virtual] int QSqlTableModel::rowCount(const QModelIndex &parent = QModelIndex()) const
Reimplementa: QSqlQueryModel::rowCount(const QModelIndex &parent) const.
[virtual slot] bool QSqlTableModel::select()
Rellena el modelo con datos de la tabla que se estableció mediante setTable(), utilizando el filtro y la condición de ordenación especificados, y devuelve true si tiene éxito; en caso contrario devuelve false.
Nota: La llamada a select() revertirá cualquier cambio no enviado y eliminará cualquier columna insertada.
Véase también setTable(), setFilter() y selectStatement().
[virtual slot] bool QSqlTableModel::selectRow(int row)
Actualiza row en el modelo con valores de la fila de la tabla de la base de datos que coinciden con los valores de la clave primaria. Sin clave primaria, todos los valores de las columnas deben coincidir. Si no se encuentra ninguna fila coincidente, el modelo mostrará una fila vacía.
Devuelve true si tiene éxito; en caso contrario devuelve false.
Véase también select().
[virtual protected] QString QSqlTableModel::selectStatement() const
Devuelve la sentencia SQL SELECT utilizada internamente para rellenar el modelo. La sentencia incluye el filtro y la cláusula ORDER BY.
Véase también filter() y orderByClause().
[override virtual] bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)
Reimplementa: QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int rol).
Establece los datos del elemento index para el rol role a value.
Para la estrategia de edición OnFieldChange, un índice puede recibir un cambio sólo si ningún otro índice tiene un cambio en caché. Los cambios se envían inmediatamente. Sin embargo, las filas que aún no se han insertado en la base de datos pueden modificarse libremente y no se envían automáticamente. Los cambios enviados no se revierten en caso de fallo.
En OnRowChange, un índice puede recibir un cambio sólo si ninguna otra fila tiene un cambio almacenado en caché. Los cambios no se envían automáticamente.
Devuelve true si value es igual al valor actual. Sin embargo, el valor no se enviará a la base de datos.
Devuelve true si el valor puede establecerse o false en caso de error, por ejemplo si index está fuera de los límites.
Devuelve false si el rol no es Qt::EditRole. Para establecer datos para roles distintos de EditRole, utilice un modelo proxy personalizado o subclase QSqlTableModel.
Véase también editStrategy(), data(), submit(), submitAll(), y revertRow().
[virtual] void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)
Establece la estrategia para editar valores en la base de datos en strategy.
Esto revertirá cualquier cambio pendiente.
Véase también editStrategy() y revertAll().
[virtual] void QSqlTableModel::setFilter(const QString &filter)
Establece el filtro actual en filter.
El filtro es una cláusula SQL WHERE sin la palabra clave WHERE (por ejemplo, name='Josephine').
Si el modelo ya está poblado con datos de una base de datos, el modelo los vuelve a seleccionar con el nuevo filtro. En caso contrario, el filtro se aplicará la próxima vez que se llame a select().
Véase también filter(), select(), selectStatement() y orderByClause().
[protected] void QSqlTableModel::setPrimaryKey(const QSqlIndex &key)
Método protegido que permite a las subclases establecer la clave primaria en key.
Normalmente, el índice primario se establece automáticamente cada vez que se llama a setTable().
Véase también primaryKey() y QSqlDatabase::primaryIndex().
bool QSqlTableModel::setRecord(int row, const QSqlRecord &values)
Aplica values a row en el modelo. Los campos de origen y destino se asignan por nombre de campo, no por posición en el registro.
Tenga en cuenta que los indicadores generados en values se conservan para determinar si los campos correspondientes se utilizan cuando se envían cambios a la base de datos. Por defecto, se establece en true para todos los campos en un QSqlRecord. Debe establecer la bandera en false utilizando setGenerated(falso) para cualquier valor en values, para guardar los cambios de nuevo en la base de datos.
Para las estrategias de edición OnFieldChange y OnRowChange, una fila puede recibir un cambio sólo si ninguna otra fila tiene un cambio almacenado en caché. Los cambios se envían inmediatamente. Los cambios enviados no se revierten en caso de fallo.
Devuelve true si se han podido establecer todos los valores; en caso contrario devuelve false.
Véase también record() y editStrategy().
[virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order)
Establece el orden de column a order. Esto no afecta a los datos actuales, para refrescar los datos usando el nuevo orden, llame a select().
Véase también sort(), select(), y orderByClause().
[virtual] void QSqlTableModel::setTable(const QString &tableName)
Establece la tabla de la base de datos sobre la que opera el modelo en tableName. No selecciona datos de la tabla, sino que obtiene la información de sus campos.
Para rellenar el modelo con los datos de la tabla, llame a select().
La información sobre errores puede obtenerse con lastError().
Véase también select(), setFilter() y lastError().
[override virtual] void QSqlTableModel::sort(int column, Qt::SortOrder order)
Reimplementa: QAbstractItemModel::sort(int columna, Qt::SortOrder orden).
Ordena los datos por column con el orden order. Esto seleccionará inmediatamente los datos, usa setSort() para establecer un orden de clasificación sin poblar el modelo con datos.
Ver también setSort(), select(), y orderByClause().
[override virtual slot] bool QSqlTableModel::submit()
Reimplementa: QAbstractItemModel::submit().
Este slot reimplementado es llamado por los delegados de ítems cuando el usuario deja de editar la fila actual.
Envía la fila actualmente editada si la estrategia del modelo es OnRowChange o OnFieldChange. No hace nada para la estrategia OnManualSubmit.
Utilice submitAll() para enviar todos los cambios pendientes para la estrategia OnManualSubmit.
Devuelve true en caso de éxito; en caso contrario devuelve false. Utilice lastError() para consultar información detallada sobre errores.
No rellena automáticamente el modelo. Las filas enviadas se actualizan desde la base de datos en caso de éxito.
Véase también revert(), revertRow(), submitAll(), revertAll() y lastError().
[slot] bool QSqlTableModel::submitAll()
Envía todos los cambios pendientes y devuelve true en caso de éxito. Devuelve false en caso de error; puede obtenerse información detallada sobre el error con lastError().
En OnManualSubmit, en caso de éxito el modelo será repoblado. Las vistas que lo presenten perderán sus selecciones.
Nota: En el modo OnManualSubmit, los cambios ya enviados no se borrarán de la caché cuando submitAll() falle. Esto permite que las transacciones sean revertidas y reenviadas sin perder datos.
Véase también revertAll() y lastError().
QString QSqlTableModel::tableName() const
Devuelve el nombre de la tabla actualmente seleccionada.
[virtual protected] bool QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values)
Actualiza el row dado en la tabla de base de datos actualmente activa con el values especificado. Devuelve true si tiene éxito; en caso contrario devuelve false.
Este es un método de bajo nivel que opera directamente sobre la base de datos y no debe ser llamado directamente. Utilice setData() para actualizar valores. El modelo decidirá en función de su estrategia de edición cuándo modificar la base de datos.
Tenga en cuenta que sólo se actualizan los valores que tienen activado el indicador generated-flag. La bandera generada puede activarse con QSqlRecord::setGenerated() y comprobarse con QSqlRecord::isGenerated().
Véase también QSqlRecord::isGenerated() y setData().
© 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.