QListWidget is not being updated or updated incorrectly
-
Hi,
To help you visualize the problem, here is a link:
http://postimg.org/image/my2cjjm79/
What I'm trying to accomplish is allow the user to enter spouse first, middle and last name (dead or alive). Once an add button that you can't see in the image is clicked a check box is created and added to the QListWidget to the right. If user notice that the name was typed incorrectly, the user has the ability to select the incorrect name and click delete to remove from the list.
I'm having 2 problems so far.
First, the image has three snapshots, I labeled them (1,2,3), in the (1), I added 3 names, a a a, b b b, and ccc. When I selected a a a and clicked the delete button, a a a was deleted but as you can see in (2) it's still using it's space. b b b didn't go up in place to take the place used to be occupied by a a a and c c c didn't take the place of b b b.
Second, if I select 2 names to delete only one is deleted. For example, in snapshot (2), I selected b b b and c c c to delete. When I clicked the delete button only b b b was deleted and as you can see in (3) c c c is still selected but not deleted. Had to click the delete button again to have c c c deleted.
In mainwindow.h I declared two QLIst
private: Ui::MainWindow *ui; QList<QListWidgetItem *> spouseListWidgetItem; QList<QCheckBox *> spouseListCheckBox;
The code for the add button from mainwindow.cpp
void MainWindow::on_addSpouseBtn_clicked() { QString spouseFirstName = ui->spouseFirstNameLineEdt->text(); QString spouseMiddleName = ui->spouseMiddleNameLineEdt->text(); QString spouseLastName = ui->spouseLastNameLineEdt->text(); QString fullName = spouseFirstName; fullName.append(" "); fullName.append(spouseMiddleName); fullName.append(" "); fullName.append(spouseLastName); spouseListWidgetItem.append(new QListWidgetItem); spouseListCheckBox.append(new QCheckBox(fullName)); ui->spouseListWidget->addItem(spouseListWidgetItem.last()); ui->spouseListWidget->setItemWidget(spouseListWidgetItem.last(), spouseListCheckBox.last()); }
The code for the delete button from the mainwindow.cpp
void MainWindow::on_deleteSpouseBtn_clicked() { for(int i = 0; i < spouseListCheckBox.size(); ++i) { if(spouseListCheckBox.at(i)->isChecked()) { spouseListCheckBox.removeAt(i); ui->spouseListWidget->removeItemWidget(spouseListWidgetItem.at(i)); spouseListWidgetItem.removeAt(i); } } }
I'm still a newbie so if you would point any improvements to the code or see anything that can cause rare errors please point them out.
Thanks in advance :)
-
Hi,
You are deleting the content of the row but you do not remove the row themselves.
From a quick look at your code, you don't seem to have taken the easiest way. Since you have a QListWidget why not make use of the Qt::ItemIsUserCheckable flag on the item rather than adding a checkbox by hand ? The QList of QListWidgetItem also looks redundant since they are already contained in the model of the QListWidget.
Hope it helps
-
I did some changes but the program stops working after I delete the first item that was added.
The new code inside the add button
void MainWindow::on_addSpouseBtn_clicked() { QString spouseFirstName = ui->spouseFirstNameLineEdt->text(); QString spouseMiddleName = ui->spouseMiddleNameLineEdt->text(); QString spouseLastName = ui->spouseLastNameLineEdt->text(); QString fullName = spouseFirstName; fullName.append(" "); fullName.append(spouseMiddleName); fullName.append(" "); fullName.append(spouseLastName); spouseListWidgetItem.append(new QListWidgetItem(fullName, ui->spouseListWidget)); spouseListWidgetItem.last()->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable ); spouseListWidgetItem.last()->setCheckState(Qt::Unchecked); ui->spouseListWidget->addItem(spouseListWidgetItem.last()); }
The code inside the delete button
void MainWindow::on_deleteSpouseBtn_clicked() { int rows = ui->spouseListWidget->count(); for(int i = 0; i < rows ; ++i) { if(spouseListWidgetItem.at(i)->checkState() == Qt::Checked) { delete ui->spouseListWidget->takeItem(i); spouseListWidgetItem.removeAt(i); } } }
Also, your reply confused me "The QList of QListWidgetItem also looks redundant since they are already contained in the model of the QListWidget." But according to the documentation "A QListWidgetItem represents a single item in a QListWidget." Wouldn't I need to contain each single item in a QList?
-
Because you're deleting it twice:
- Once when you call delete after takeItem.
- And again when calling removeAt
No you don't. When you call addItem, you put the QListWidgetItem in the model of the QListWidget. If you need it again, you can retrieve it from QListWidget.