最近使用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){
..................
}
}
仅作笔记供自省,共勉