QTableWidget widget Qt

En el tutorial anterior tratamos el tema de acceso a datos con Qt, aprendimos a conectarnos y consultar datos de las bases de datos SQLite  y MySQL, los resultados de las consultas los mostramos en consola, ahora veremos el widget QTableWidget que nos permite mostrar datos en formato tabla, filas y columnas, los utilizaremos para visualizar el contenido de nuestra base de datos, usaremos como base el tutorial antes mencionado.

Al crear un QTableWidget podemos indicar la cantidad de filas y columnas que tendrá usando el constructor, o podemos hacerlo posteriormente con los métodos setRowCount() y setColumnCount() respectivamente.

tableWidget1 = new QTableWidget(12, 3, this);

tableWidget2 = new QTableWidget(this);
tableWidget2->setRowCount(10);
tableWidget2->setColumnCount(5);

La clase QTableWidgetItem representa el contenido de la tabla, cada celda de la misma estará representada por un objeto de esta clase, para hacer esto usamos el método setItem(row, col, item) de la tabla, debemos indicar la fila y la columna además del objeto que deseamos añadir.

QTableWidget *table = new QTableWidget(10, 5);                                          
                                                                                        
for(int col = 0; col < 5; col++) {                                                      
    for(int row = 0; row < 10; row++ ) {                                                
        QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg((row+1)*(col+1)));
        table->setItem(row, col, newItem);                                              
    }                                                                                   
}

Con esto creamos una aplicación que muestra la tabla de multiplicar, solo 10 filas y cinco columnas, el resultado es:

QTableWidget control Qt

Si deseas ocultar las cabeceras de filas o columnas puedes usar estos respectivos métodos:

table->horizontalHeader()->hide();
table->verticalHeader()->hide();

Si lo que deseamos es cambiar el texto que muestra la cabecera usaremos los métodos setHorizontalHeaderLabels(QStringList) para las cabeceras horizontales y setVerticalHeaderLabels(QStringList) para las verticales, ejemplo.

QStringList headers = { "Uno", "Dos", "Tres", "Cuadro", "Cinco" };
table->setHorizontalHeaderLabels(headers);

En caso de que deseemos personalizar un encabezado, por ejemplo, agregar icono, alinear texto, cambiar el etilo, etc., lo haremos de esta manera:

QTableWidgetItem *headerItem = new QTableWidgetItem(tr("Header"));
headerItem->setIcon(QIcon(QPixmap(":/qt.png")));
headerItem->setTextAlignment(Qt::AlignVCenter);

Solo modificamos la cabecera para la primera columna, igual podemos hacerlo con las demás, o también con las cabeceras de filas.

Cambiar header de QTableWidget

Integrar el QTableWidget con Base de datos

Ahora vamos a lo que nos interesa, aplicando lo aprendido creamos una tabla en donde mostramos los datos obtenido de una BD, para este ejemplo usaremos la tabla y la conexión a SQLite que estudiamos en el tutorial previo, por ello no profundizaremos en detalles.

QTableWidget con acceso a datos

El código C++ que genera esta salida es el siguiente:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    QTableWidget *table = new QTableWidget(10, 4);

    QStringList headers = { "ID", "NOMBRE", "APELLIDO", "EDAD" };
    table->setHorizontalHeaderLabels(headers);

    QSqlQuery query;
    query.exec("SELECT * FROM person;");

    int row = 0;

    while(query.next())
    {
        QTableWidgetItem *idItem = new QTableWidgetItem(query.value(0).toString());
        table->setItem(row, 0, idItem);

        QTableWidgetItem *nameItem = new QTableWidgetItem(query.value(1).toString());
        table->setItem(row, 1, nameItem);

        QTableWidgetItem *lastItem = new QTableWidgetItem(query.value(2).toString());
        table->setItem(row, 2, lastItem);

        QTableWidgetItem *ageItem = new QTableWidgetItem(query.value(3).toString());
        table->setItem(row, 3, ageItem);

        row++;
    }

    setCentralWidget(table);
    setWindowTitle("QTableWidget");
}

El código para conectar a la base de datos SQLite en memoria, es decir los datos no persisten entre ejecuciones de la aplicación.

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");

Finalizamos de momento, hasta la próxima.

Descargar proyecto: qtablewidget-sqlite.zip

Comentarios

  1. Bro, si quiero poner un encabezado o varios encabezados encima de uno. Cómo sería?. Ejm: Tendria una agrupación en el ejemplo que pusiste de "ID, NOMBRE, APELLIDO, EDAD". Yo quisiera que Nombre y Apeliido en su encabezado diría: Son String, y en ID y EDAD dijese: Int. Si hay solución me la puedes dar?.

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

Conectar SQL Server con Java

Histogramas OpenCV Python

Controles y Contenedores JavaFX 8 - I