2013-04-06 22 views
29

Sto tentando di eliminare tutte le righe da un QTableWidget. Ecco cosa ho provato.Come eliminare tutte le righe da QTableWidget

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

Avevo due file nel mio tavolo. Ma questo ha appena cancellato una singola riga. Un motivo potrebbe essere che non ho creato il tavolo con una dimensione di tabella fissa. La documentazione Qt per rowCount() dice,

Questa proprietà contiene il numero di righe nella tabella.

Per impostazione predefinita, per una tabella costruita senza i conteggi di righe e colonne, Questa proprietà contiene un valore pari a 0.

Quindi, se questo è il caso, qual è il modo migliore per rimuovere tutte le righe dalla tabella ?

risposta

59

Basta impostare il conteggio delle righe a 0 con:

mTestTable->setRowCount(0); 

si cancellerà automaticamente la QTableWidgetItem s, chiamando removeRows come si può vedere in QTableWidget interno codice modello:

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

grazie .. la soluzione più semplice di tutte! – vinayan

+0

cambiando la risposta accettata a questo in quanto questo è il metodo più semplice .. – vinayan

28

Non so QTableWidget ma il codice sembra avere un difetto logico. Stai dimenticando che mentre fai il giro del ciclo stai diminuendo il valore di mTestTable->rowCount(). Dopo aver rimosso una riga, i sarà uno e mTestTable->rowCount() sarà uno, quindi il ciclo si interrompe.

lo farei in questo modo

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

yes..it era un flusso logico .. il codice funziona benissimo! – vinayan

+0

GRANDE PUNTO !!! –

+4

non è davvero una buona soluzione in quanto può essere enormemente lento sui big data. 'removeRow (mTestTable-> rowCount() - 1)' dovrebbe essere molto più veloce. – sshilovsky

0

Il codice non elimina ultima riga.

Prova questo.

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

Nel codice, la prima volta, rowCount() hanno un valore 2 e il valore della i è 0, quindi la sua eliminazione 1 st fila,

Ma il secondo valore del i incrementato con 1 , ma rowCount() restituisce il numero di righe aggiornato che ora è 1, quindi non elimina l'ultima riga.

Spero che ora sia chiaro.

+0

questo non sembra funzionare .. probabilmente l'indice continua a cambiare quando una riga viene cancellata .. – vinayan

+0

@vinayan - Mi dispiace che tu abbia torto. Se si considera il numero totale di righe è 2, e nella prima iterazione 'rowCount()' = 2, la prima riga viene cancellata nell'indice di '(i = 0)' 0th, e nella seconda iterazione 'rowCount () '= 1 e l'indice di' (i = 1) '1st quindi il suo tentativo di cancellare sull'indice del 1o ma in 1a riga dell'indice è spostato a 0esimo indice quando viene cancellata la riga 0, Quindi qui il codice postato da @Vinayan non lavoro .. –

+0

hai ragione riguardo alla logica .. in realtà il rowCount() non mi da il valore 2 come dovrebbe, poiché Qt dà rowCount() = 0 per le tabelle create senza righe predefinite come nel mio caso..grazie per la risposta – vinayan

0

Guardate questo post: 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

questo potrebbe funzionare..ma sembra un sacco di codice per eliminare un paio di righe :) – vinayan

+1

questo è appropriato solo per eliminare una serie specifica di righe – UmNyobe

7

AFAIK setRowCount(0) non rimuove nulla. Gli oggetti sono ancora lì, ma non più visibili.

yourtable->model()->removeRows(0, yourtable->rowCount()); 
6
QTableWidget test; 
test.clear(); 
test.setRowCount(0); 
+3

Sarebbe bene aggiungere alcuni commenti o spiegazioni al codice nelle vostre risposte. – skrrgwasme

+0

Questo è il modo più semplice per farlo. anche +1 per setRowCount (0) – rhodysurf

+0

Questo non rimuove nulla, vedere la risposta di @ damkrat sotto – blented

0

Rimuove tutte le voci non nelle intestazioni dalla vista. Questo rimuoverà anche tutte le selezioni. Le dimensioni del tavolo rimangono le stesse.

void QTableWidget::clearContents() 

Rimuove tutti gli elementi nella vista. Questo rimuoverà anche tutte le selezioni e le intestazioni.

2

Per evitare un arresto anomalo dell'app, scollegare tutti i segnali da QTableView.

2

Il modo semplice per eliminare le righe è impostare il conteggio delle righe su zero. Questo utilizza removeRows() internamente.

table->setRowCount(0); 

È anche possibile cancellare il contenuto e quindi rimuovere tutte le righe.

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

Entrambi i frammenti lasciano intatte le intestazioni!

Se è necessario eliminare anche le intestazioni, è possibile passare da clearContents() a clear().

0

Si può solo aggiungere modello di elemento vuoto (QStandardItemModel) al vostro QTableView (myTableView):

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