QT 5.12.0版本
QListWidget刪除QListWidgetItem子項
void widgetlist::onDelItemSlot()
{
int row = ui->listWidget->currentRow();
ui->listWidget->takeItem(row);
//QListWidgetItem* item = ui->listWidget->currentItem();
//ui->listWidget->removeItemWidget(item);
//delete item;
ui->comboBox->removeItem(ui->comboBox->currentIndex());
}
經過測試:
int row = ui->listWidget->currentRow();
ui->listWidget->takeItem(row);
或者直接
QListWidgetItem* item = ui->listWidget->currentItem();
//ui->listWidget->removeItemWidget(item);
delete item;
即takeItem(ui->listWidget->currentRow());
或者delete ui->listWidget->currentItem();
可以正常刪除選中項
但是通過 ui->listWidget->removeItemWidget(ui->listWidget->currentItem());
無法刪除,通過跟蹤源碼。
inline void QListWidget::removeItemWidget(QListWidgetItem *aItem)
{ setItemWidget(aItem, nullptr); }
void QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget)
{
Q_D(QListWidget);
QModelIndex index = d->listModel()->index(item);
QAbstractItemView::setIndexWidget(index, widget);
}
void QAbstractItemView::setIndexWidget(const QModelIndex &index, QWidget *widget)
{
Q_D(QAbstractItemView);
if (!d->isIndexValid(index))
return;
if (indexWidget(index) == widget)
return;
if (QWidget *oldWidget = indexWidget(index)) {
d->persistent.remove(oldWidget);
d->removeEditor(oldWidget);
oldWidget->removeEventFilter(this);
oldWidget->deleteLater();
}
if (widget) {
widget->setParent(viewport());
d->persistent.insert(widget);
d->addEditor(index, widget, true);
widget->installEventFilter(this);
widget->show();
dataChanged(index, index); // update the geometry
if (!d->delayedPendingLayout)
widget->setGeometry(visualRect(index));
}
}
在執行到
if (indexWidget(index) == widget)
return;
直接就返回了,可見這個接口並非刪除子項。
在QT助手中有如下說明
void QListWidget::removeItemWidget(QListWidgetItem *item)
Removes the widget set on the given item.
To remove an item (row) from the list entirely, either delete the item or use takeItem().
This function was introduced in Qt 4.3.
See also itemWidget() and setItemWidget().
回過頭來就可以理解了,以上即說明
removeItemWidget刪除設置的widget並非默認的QListWidgetItem對應的row
刪除使用takeItem或者delete
另外在刪除全部項的時候需要注意循環變量。
void widgetlist::onDelAllItemSlot()
{
int listCnt = ui->listWidget->count();
int cbxCnt = ui->comboBox->count();
while(listCnt + 1)
{
ui->listWidget->takeItem(--listCnt);
}
while(cbxCnt + 1)
{
ui->comboBox->removeItem(--cbxCnt);
}
}
即最好從后后往前刪,防止出現size變更引起是刪除達不到預期效果,刪除不完整。
或者
ui->listWidget->clear();
直接clear刪除全部。
