setItemWidget 和removeItemWidget

最近使用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){

    ..................

   }

}

 

僅作筆記供自省,共勉

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章