Presentación de Datos en una Vista de Tabla

Las clases QSqlQueryModel, QSqlTableModel, y QSqlRelationalTableModel pueden usarse como fuente de datos para las clases de vista de Qt como QListView, QTableView, y QTreeView. En la práctica, QTableView es con mucho la elección más común, porque un conjunto de resultados SQL es esencialmente una estructura de datos bidimensional.

Una vista de tabla que muestra un QSqlTableModel

El siguiente ejemplo crea una vista basada en un modelo de datos SQL:

    QTableView *view = new QTableView;
    view->setModel(model);
    view->show();

Si el modelo es de lectura-escritura (por ejemplo, QSqlTableModel), la vista permite al usuario editar los campos. Puede desactivar esta opción llamando a

    view->setEditTriggers(QAbstractItemView::NoEditTriggers);

Puede utilizar el mismo modelo como fuente de datos para varias vistas. Si el usuario edita el modelo a través de una de las vistas, las otras vistas reflejarán los cambios inmediatamente. El ejemplo del Modelo de Tabla muestra cómo funciona.

Las clases de vista muestran una cabecera en la parte superior para etiquetar las columnas. Para cambiar los textos de la cabecera, llame a setHeaderData() en el modelo. Las etiquetas de la cabecera son por defecto los nombres de los campos de la tabla. Por ejemplo:

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("City"));
    model->setHeaderData(3, Qt::Horizontal, QObject::tr("Country"));

QTableView también tiene una cabecera vertical a la izquierda con números que identifican las filas. Si inserta filas mediante programación utilizando QSqlTableModel::insertRows(), las nuevas filas se marcarán con un asterisco (*) hasta que se envíen utilizando submitAll() o automáticamente cuando el usuario se desplace a otro registro (suponiendo que edit strategy sea QSqlTableModel::OnRowChange).

Insertar una fila en un modelo

Del mismo modo, si elimina filas utilizando removeRows(), las filas se marcarán con un signo de exclamación (!) hasta que se envíe el cambio.

Los elementos de la vista se renderizan utilizando un delegado. El delegado por defecto, QStyledItemDelegate, maneja los tipos de datos más comunes (int, QString, QImage, etc.). El delegado también es responsable de proporcionar los widgets del editor (por ejemplo, un cuadro combinado) cuando el usuario empieza a editar un elemento de la vista. Puede crear sus propios delegados subclasificando QAbstractItemDelegate o QStyledItemDelegate. Consulte Programación Modelo/Vista para obtener más información.

QSqlTableModel está optimizado para operar sobre una única tabla a la vez. Si necesita un modelo de lectura-escritura que opere sobre un conjunto de resultados arbitrario, puede subclasificar QSqlQueryModel y reimplementar flags() y setData() para hacerlo de lectura-escritura. Las dos funciones siguientes permiten editar los campos 1 y 2 de un modelo de consulta:

Qt::ItemFlags EditableSqlModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QSqlQueryModel::flags(index);
    if (index.column() == 1 || index.column() == 2)
        flags |= Qt::ItemIsEditable;
    return flags;
}

bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
{
    if (index.column() < 1 || index.column() > 2)
        return false;

    QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
    int id = data(primaryKeyIndex).toInt();

    clear();

    bool ok;
    if (index.column() == 1)
        ok = setFirstName(id, value.toString());
    else
        ok = setLastName(id, value.toString());
    refresh();
    return ok;
}

La función de ayuda setFirstName() se define como sigue:

bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
    QSqlQuery query;
    query.prepare("update person set firstname = ? where id = ?");
    query.addBindValue(firstName);
    query.addBindValue(personId);
    return query.exec();
}

La función setLastName() es similar. Consulte el ejemplo de modelo de consulta para ver el código fuente completo.

Subclasificar un modelo permite personalizarlo de muchas maneras: Puede proporcionar información sobre herramientas para los elementos, cambiar el color de fondo, proporcionar valores calculados, proporcionar diferentes valores para ver y editar, manejar valores nulos especialmente, y más. Para más detalles, consulte Programación de Modelos/Vistas, así como la documentación de referencia de QAbstractItemView.

Si todo lo que necesita es resolver una clave externa a una cadena más amigable, puede utilizar QSqlRelationalTableModel. Para obtener mejores resultados, también debería utilizar QSqlRelationalDelegate, un delegado que proporciona editores de combobox para editar claves externas.

Edición de una clave externa en una tabla relacional

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

© 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.