widgetattribute example c++ qt qtablewidget

c++ - widgetattribute - qwidget table example



Cómo eliminar todas las filas de QTableWidget (10)

AFAIK setRowCount(0) no elimina nada. Los objetos todavía están allí, pero no más visibles.

yourtable->model()->removeRows(0, yourtable->rowCount());

Estoy intentando eliminar todas las filas de un QTableWidget . Esto es lo que intenté.

for ( int i = 0; i < mTestTable->rowCount(); ++i ) { mTestTable->removeRow(i); }

Tenía dos filas en mi mesa. Pero esto acaba de eliminar una sola fila. Una razón podría ser que no creé la tabla con un tamaño de tabla fijo. La documentación de Qt para rowCount() dice:

Esta propiedad contiene el número de filas en la tabla.

De forma predeterminada, para una tabla construida sin recuentos de filas y columnas, esta propiedad contiene un valor de 0.

Entonces, si ese es el caso, ¿cuál es la mejor manera de eliminar todas las filas de la tabla?


Elimina todos los elementos que no están en los encabezados de la vista. Esto también eliminará todas las selecciones. Las dimensiones de la mesa permanecen iguales.

void QTableWidget::clearContents()

Elimina todos los elementos en la vista. Esto también eliminará todas las selecciones y encabezados.

void QTableWidget::clear()


La manera simple de eliminar filas es establecer el recuento de filas en cero. Esto usa removeRows () internamente.

table->setRowCount(0);

También puede borrar el contenido y luego eliminar todas las filas.

table->clearContents(); table->model()->removeRows(0, table->rowCount());

¡Ambos fragmentos dejan intactos los encabezados!

Si necesita deshacerse de los encabezados, también, puede cambiar de clearContents() a clear() .


Mira esta publicación: http://forum.qt.io/topic/1715/qtablewidget-how-to-delete-a-row

QList<QTableWidgetItem*> items = table.findItems(.....); QMap<int, int> rowsMap; for(int i = 0; i < items.count(); i++{ rowsMap[items.at(i).row()] = -1; //garbage value } QList<int> rowsList = rowsMap.uniqueKeys(); qSort(rowsList); //Now go through your table and delete rows in descending order as content would shift up and hence cannot do it in ascending order with ease. for(int i = rowList.count() - 1; i >= 0; i--){ table.removeRow(rowList.at(i)); }


No sé QTableWidget pero su código parece tener un error de lógica. Se está olvidando que a medida que mTestTable->rowCount() el ciclo está disminuyendo el valor de mTestTable->rowCount() . Después de haber eliminado una fila, seré uno y mTestTable->rowCount() también será uno, por lo que su ciclo se detiene.

Lo haría así

while (mTestTable->rowCount() > 0) { mTestTable->removeRow(0); }


Para evitar un bloqueo de la aplicación, desconecte todas las señales de QTableView.

// Deselects all selected items ui->tableWidget->clearSelection(); // Disconnect all signals from table widget ! important ! ui->tableWidget->disconnect(); // Remove all items ui->tableWidget->clearContents(); // Set row count to 0 (remove rows) ui->tableWidget->setRowCount(0);


Puede agregar el modelo de elemento vacío (QStandardItemModel) a su QTableView (myTableView):

itemModel = new QStandardItemModel; ui->myTableView->setModel(itemModel);


Simplemente configure el recuento de filas en 0 con:

mTestTable->setRowCount(0);

borrará automáticamente QTableWidgetItem s, llamando removeRows como se puede ver en el código de modelo interno de QTableWidget :

void QTableModel::setRowCount(int rows) { int rc = verticalHeaderItems.count(); if (rows < 0 || rc == rows) return; if (rc < rows) insertRows(qMax(rc, 0), rows - rc); else removeRows(qMax(rows, 0), rc - rows); }


Tu código no elimina la última fila.

Prueba este.

int totalRow = mTestTable->rowCount(); for ( int i = 0; i < totalRow ; ++i ) { mTestTable->removeRow(i); }

En su código, la primera vez, rowCount() tiene el valor 2 y el valor de i es 0 , por lo que es eliminar la 1ª fila,

Pero en el valor de la segunda vez rowCount() con 1 , pero rowCount() devuelve el recuento de filas actualizado que ahora es 1, por lo tanto, no elimina la última fila.

Espero que ahora seas claro.


QTableWidget test; test.clear(); test.setRowCount( 0);