web-dev-qa-db-fra.com

Comment supprimer toutes les lignes de QTableWidget

J'essaie de supprimer toutes les lignes d'un QTableWidget . Voici ce que j'ai essayé.

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

J'avais deux rangées dans ma table. Mais cela vient de supprimer une seule ligne. Une raison pourrait être que je n'ai pas créé la table avec une taille de table fixe. La documentation Qt pour rowCount () dit,

Cette propriété contient le nombre de lignes de la table.

Par défaut, pour une table construite sans nombre de lignes et de colonnes, cette propriété contient une valeur de 0.

Si c'est le cas, quelle est la meilleure façon de supprimer toutes les lignes du tableau?

33
vinayan

Réglez simplement le nombre de lignes sur 0 avec:

mTestTable->setRowCount(0);

il supprimera automatiquement les QTableWidgetItems, en appelant removeRows comme vous pouvez le voir dans le code de modèle interne 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);
}
74
alexisdm

Je ne sais pas QTableWidget mais votre code semble avoir une faille logique. Vous oubliez qu'en faisant le tour de la boucle, vous diminuez la valeur de mTestTable->rowCount(). Après avoir supprimé une ligne, i en sera une et mTestTable->rowCount() sera également une, donc votre boucle s'arrête.

Je le ferais comme ça

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

AFAIK setRowCount(0) ne supprime rien. Les objets sont toujours là, mais plus visibles.

yourtable->model()->removeRows(0, yourtable->rowCount());
11
damkrat
QTableWidget test;
test.clear();
test.setRowCount( 0);
5
Alex Gurkin

La manière simple de supprimer des lignes consiste à définir le nombre de lignes à zéro. Cela utilise removeRows () en interne.

table->setRowCount(0);

Vous pouvez également effacer le contenu, puis supprimer toutes les lignes.

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

Les deux extraits laissent les en-têtes intacts!

Si vous devez également vous débarrasser des en-têtes, vous pouvez passer de clearContents() à clear().

3
Jens A. Koch

Afin d'éviter un plantage de l'application, déconnectez tous les signaux 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);
2
Rémi Debord

Supprime tous les éléments ne figurant pas dans les en-têtes de la vue. Cela supprimera également toutes les sélections. Les dimensions de la table restent les mêmes.

void QTableWidget::clearContents()

Supprime tous les éléments de la vue. Cela supprimera également toutes les sélections et en-têtes.

void QTableWidget::clear()
0
user2076767

Votre code ne supprime pas la dernière ligne.

Essaye celui-là.

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

Dans votre code, la première fois, rowCount() a la valeur 2 Et la valeur de i est 0, Donc sa suppression 1 st row,

Mais la deuxième fois, la valeur de i est incrémentée de 1, Mais rowCount() renvoie le nombre de lignes mis à jour qui est maintenant 1, donc, il ne supprime pas la dernière ligne.

J'espère que maintenant vous serez clair.

0
AB Bolim

Regardez cet article: 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));
}
0
d.danailov

Vous pouvez simplement ajouter un modèle d'élément vide (QStandardItemModel) à votre QTableView (myTableView):

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