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?
Réglez simplement le nombre de lignes sur 0 avec:
mTestTable->setRowCount(0);
il supprimera automatiquement les QTableWidgetItem
s, 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);
}
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);
}
AFAIK setRowCount(0)
ne supprime rien. Les objets sont toujours là, mais plus visibles.
yourtable->model()->removeRows(0, yourtable->rowCount());
QTableWidget test;
test.clear();
test.setRowCount( 0);
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()
.
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);
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()
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.
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));
}
Vous pouvez simplement ajouter un modèle d'élément vide (QStandardItemModel) à votre QTableView (myTableView):
itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);