Uso de bases de datos SQL con Qt Quick Views
Modelos SQL
Qt proporciona clases C++ que soportan modelos de datos SQL. Estas clases trabajan de forma transparente sobre los datos SQL subyacentes, reduciendo la necesidad de ejecutar consultas SQL para operaciones SQL básicas como crear, insertar o actualizar. Para obtener más información sobre estas clases, consulte Uso de las clases de modelos SQL.
Aunque las clases C++ proporcionan conjuntos de funciones completos para operar con datos SQL, no proporcionan acceso a los datos a QML. Por lo tanto, debe implementar un modelo de datos personalizado de C++ como una subclase de una de estas clases y exponerlo a QML como un tipo o una propiedad de contexto.
Modelo de datos de sólo lectura
El modelo personalizado debe reimplementar los siguientes métodos para permitir el acceso de sólo lectura a los datos desde QML:
- roleNames() para exponer los nombres de rol al frontend de QML. Por ejemplo, la siguiente versión devuelve los nombres de campo de la tabla seleccionada como nombres de rol:
QHash<int, QByteArray> SqlQueryModel::roleNames() const { QHash<int, QByteArray> roles; // record() returns an empty QSqlRecord for (int i = 0; i < this->record().count(); i ++) { roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8()); } return roles; }
- data() para exponer datos SQL al módulo de acceso QML. Por ejemplo, la siguiente implementación devuelve datos para el índice de modelo dado:
QVariant SqlQueryModel::data(const QModelIndex &index, int role) const { QVariant value; if (index.isValid()) { if (role < Qt::UserRole) { value = QSqlQueryModel::data(index, role); } else { int columnIdx = role - Qt::UserRole - 1; QModelIndex modelIndex = this->index(index.row(), columnIdx); value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole); } } return value; }
La clase QSqlQueryModel es lo suficientemente buena para implementar un modelo personalizado de sólo lectura que represente datos en una base de datos SQL. El ejemplo del tutorial de chat lo demuestra muy bien implementando un modelo personalizado para obtener los datos de contacto de una base de datos SQLite.
Modelo de datos editable
QSqlTableModel proporciona un modelo de datos editable para una única tabla de base de datos, e implementa setData() como se describe en la documentación general de Programación Modelo/Vista.
Dependiendo de la EditStrategy utilizada por el modelo, los cambios se ponen en cola para ser enviados más tarde o se envían inmediatamente.
También puede insertar nuevos datos en el modelo llamando a QSqlTableModel::insertRecord(). En el siguiente fragmento de ejemplo, se rellena un QSqlRecord con detalles del libro y se añade al modelo:
... QSqlRecord newRecord = record(); newRecord.setValue("author", "John Grisham"); newRecord.setValue("booktitle", "The Litigators"); insertRecord(rowCount(), newRecord); ...
© 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.