最近使用QTreeWidget 作爲屬性編輯器,因爲沒有實現QTreeWidgetItem的委託,所以使用其ItemWidget,即單擊QTreeWidgetItem時設置其ItemWidget,編輯完成後removeItemWidget,
QTreeWidget *treeWidget;
QTreeWidgetItem *item;
QLineEdit * editor = new QLineEdit();
treeWidget->setItemWidget(item,1,editor);
編輯完成後
treeWidget->removeItemWidget(item,1);
delete editor;
運行時錯誤,csdn上問了,說removeItemWidget時已經將editor刪除了,不用手動刪除。
昨天追溯了一下發現確實如此
removeItemWidget(item,1);
調用的setItemWidget(item,1,0);
繼續找,發現最後調用的
void QAbstructItemView::setIndexWidget(const QModeIndex &index,QWidget * widget)
{
Q_D(QAbstructItemView);
if(! d->isIndexValid(index))
return;
if(QWidget * oldWidget = indexWidget(index){ //在這裏對原來可能存在的ItemWidget清空刪除了
d->persistentremove(oldWidget);
d->removeEditor(oldWidget);
oldWidget->deleteLater();
}
if(widget){
..................
}
}
僅作筆記供自省,共勉