Remove row button in QTableview
-
Hello all!
I am having some problems with a QPushButton used inside a QTableview. This button needs to remove the row but when I remove one row its changes the index and the button starts to remove the wrong row.
How can I pass the right parameter to void "MainWindow::on_excluir_clicked(int linha)" ?
Thanks a lot.
Code below:
@
void MainWindow::adicionarLinha(QStandardItemModel *modelo, QTableView *tabela)
{
spinBoxDelegar = new spinBoxDelegate(this);QPushButton *excluirButton = new QPushButton(*iconeExcluirButton, "", 0); excluirButton = new QPushButton(*iconeExcluirButton, "", 0); excluirButton->setStyleSheet("background-color: rgb(255, 255, 255); color: rgb(255, 255, 255); border: 0"); QSignalMapper *mapearSinalBotaoExcluir = new QSignalMapper(this); modelo->insertRow(modelo->rowCount()); modelo->setData(modelo->index(modelo->rowCount()-1,1), 1); tabela->setItemDelegateForColumn(1, spinBoxDelegar); tabela->setIndexWidget(modelo->index(modelo->rowCount()-1,2), excluirButton); tabela->edit(modelo->index(modelo->rowCount()-1,0)); mapearSinalBotaoExcluir->setMapping(excluirButton, modelo->rowCount()-1); connect(excluirButton, SIGNAL(clicked()), mapearSinalBotaoExcluir, SLOT(map())); connect(mapearSinalBotaoExcluir, SIGNAL(mapped(int)), this, SLOT(on_excluir_clicked(int)));
}
void MainWindow::on_excluir_clicked(int linha)
{
this->modelo1->removeRow(linha);
}
@ -
Hi,
Every time you remove a row, the other will have their index changed so your buttons will be completely off.
You should rather scan your table until you find the line with the button you just clicked. Look for sender() and indexWidget().
Hope it helps
-
Do you mean the for loop that goes from row 0 to count() -1 ?
-
You can simply compare the pointer returned by sender() to the pointer given by indexWidget()
-
You're welcome !
If this solves your question, please update the thread title prepending [solved] so other forum users may know a solution has been found :)
-
Hello @Legnain !
Here it goes:
void MainWindow::on_excluir_clicked1() { QPushButton *clicado = qobject_cast<QPushButton *>(sender()); for(int i = 0; i < this->modelo1->rowCount(); i++) { if(clicado == this->ui->tableView->indexWidget(this->modelo1->index(i,5))) { this->modelo1->removeRow(i); } } }