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);
}