Gestión directa de datos en tablas con QTableView y QSqlTableModel

Este documento expone la implemantación de operaciones CRUD (Crear, Leer, Actualizar, Borrar) directamante en una vista de tabla mediante QSqlTableModel y QTableView en aplicaciones Qt. Se describen los métodos para insertar, eliminar, modificar, confirmar y revertir cambios en una base de datos SQL desde la interfaz gráfica.

Configuración del QSqlTableModel

El modelo QSqlTableModel se emplea para proporcionar una interfaz editable a una tabla de base de datos. A continuación, se muestra su inicialización básica:

// Inicializar el modelo con una conexión a la base de datos
QSqlTableModel *modeloTabla = new QSqlTableModel(this, conexionBD);
modeloTabla->setTable("nombre_tabla"); // Especificar la tabla objetivo

// Establecer la estrategia de edición a envío manual
modeloTabla->setEditStrategy(QSqlTableModel::OnManualSubmit);

Inserción de nuevos registros

Para agregar un nuevo registro, se carga completamente el modelo, se inserta una fila al final y se activa el modo de edición en la tabla. Esto permite al usuario introducir datos mediante doble clic.

void GestorDatos::enClicAgregar()
{
    m_modoEdicion = true; // Indicador de modo edición activado

    // Deshabilitar botones de acción y habilitar controles de confirmación
    ui->botonEditar->setEnabled(false);
    ui->botonAgregar->setEnabled(false);
    ui->botonEliminar->setEnabled(false);
    ui->botonCancelar->setEnabled(true);
    ui->botonConfirmar->setEnabled(true);

    // Cargar todos los registros en el modelo
    while (modeloTabla->canFetchMore()) {
        modeloTabla->fetchMore();
    }

    int filaActual = modeloTabla->rowCount();
    modeloTabla->insertRow(filaActual); // Insertar fila vacía

    // Permitir edición con doble clic
    ui->vistaTabla->setEditTriggers(QTableView::DoubleClicked);
    ui->vistaTabla->scrollToBottom(); // Desplazar al final
}

Eliminación de regisrtos

La eliminación se realiza seleccionando una fila y confirmando la acción. Se utiliza removeRow para marcar la eliminación y submitAll para aplicar los cambios a la base de datos.

void GestorDatos::enClicEliminar()
{
    QModelIndex indice = ui->vistaTabla->currentIndex();
    modeloTabla->removeRow(indice.row()); // Marcar fila para eliminación

    // Confirmar la eliminación con el usuario
    int respuesta = QMessageBox::warning(this, "Eliminar registro",
        "¿Confirma la eliminación de la fila seleccionada?",
        QMessageBox::Yes | QMessageBox::No);

    if (respuesta == QMessageBox::No) {
        modeloTabla->revertAll(); // Revertir si se cancela
        return;
    }

    modeloTabla->submitAll(); // Aplicar eliminación a la BD
    modeloTabla->select(); // Actualizar la vista
}

Modificación de datos existentes

Para editar registros, se activa el modo de edición de la tabla, permitiendo al usuario modificar celdas existentes mediante doble clic.

void GestorDatos::enClicEditar()
{
    m_modoEdicion = true;
    ui->vistaTabla->setEditTriggers(QAbstractItemView::DoubleClicked);

    // Ajustar estado de botones
    ui->botonAgregar->setEnabled(false);
    ui->botonEditar->setEnabled(false);
    ui->botonEliminar->setEnabled(false);
    ui->botonCancelar->setEnabled(true);
    ui->botonConfirmar->setEnabled(true);
}

Confirmación de cambios

La función de confirmación envía todas las modificaciones pendientes a la base de datos después de la validación del usuario.

void GestorDatos::enClicConfirmar()
{
    m_modoEdicion = false;

    int respuesta = QMessageBox::warning(this, "Guardar cambios",
        "¿Desea aplicar todas las modificaciones realizadas?",
        QMessageBox::Yes | QMessageBox::No);

    if (respuesta == QMessageBox::No) {
        return; // Cancelar si el usuario no confirma
    }

    modeloTabla->submitAll(); // Persistir cambios

    // Restablecer controles de la interfaz
    ui->botonAgregar->setEnabled(true);
    ui->botonEditar->setEnabled(true);
    ui->botonEliminar->setEnabled(true);
    ui->botonCancelar->setEnabled(false);
    ui->botonConfirmar->setEnabled(false);

    // Desactivar edición en la tabla
    ui->vistaTabla->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

Reversión de operaciones

La operación de cancelación deshace todas las ediciones no confirmadas, restaurando el estado anterior del modelo.

void GestorDatos::enClicCancelar()
{
    m_modoEdicion = false;
    modeloTabla->revertAll(); // Revertir cambios no guardados

    // Rehabilitar botones de acción
    ui->botonAgregar->setEnabled(true);
    ui->botonEditar->setEnabled(true);
    ui->botonEliminar->setEnabled(true);
    ui->botonCancelar->setEnabled(false);
    ui->botonConfirmar->setEnabled(false);

    ui->vistaTabla->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

Etiquetas: QSqlTableModel QTableView Qt SQL CRUD

Publicado el 6-5 03:34