2014-07-18 47 views
0

崩潰我使用QTreeWidget:ExtendedSelection與QTreeWidget上刪除

mTreeWdg->的setSelectionMode(QAbstractItemView中:: ExtendedSelection);

mTreeWdg-> setSelectionBehavior(QAbstractItemView :: SelectRows);

並具有刪除樹中所有選定項目的功能。當我點擊每一個,它工作正常。但是,當我通過先點擊選擇項目,結束然後最後一個項目,它刪除第一個,然後崩潰。

OnBtnClickedDelete(){ 
QList<QTreeWidgetItem* > list = mTree->selectedItems(); 
QList<QTreeWidgetItem*>::iterator it; 

for(it=list.begin(); it!= list.end(); it++) 
{ 
try 
{ 
    QTreeWidgetItem* current_item=*it; 
    if(current_item != 0) 
    { 
     int ind=current_item->data(0,Qt::UserRole).toInt(); 
     if(ind > 0) 
     { 
      if(MyMessageBox(
       tr("Are you sure you want to " \ 
       "delete this ?"),  
       QMessageBox::Question, 
       QMessageBox::Yes | QMessageBox::No)==QMessageBox::Yes) 
      { 
       mPro.mDelete(ind-1); 
       mSth.Clear(); 

       this->RefreshTree(); 

       EnableAllControls(false); 

       if(this->mTree->topLevelItemCount() == 1) 
       {    
        EnableButtons(FALSE); 
        set_enabled(mButtonGenerate,true); 
        set_enabled(mButtonNew,true); 
       } 
      } 
     }    
    }  
} 

catch (std::exception& e) 
{ 
    default_exception_handler(e); 
} 
}}} 
+0

是什麼MPRO?和mSth?當然,如果你改變QTreeWidget層次結構('this-> RefreshTree()'),當前迭代器變得無效...也許你需要一個「休息」 – eferion

+0

但爲什麼這個工程時,我用鼠標單擊多個項目?如果我點擊3個不同的項目,它將刪除所有這些項目。 – user2944505

+0

嘗試將RefreshTree和下面的行放在循環之外。迭代時不要刷新樹小部件。如果你不想刪除沒有刪除的樹,使用bool變量。 – eferion

回答

0

就利用這一點,我假設你已經選擇了一些項目,然後單擊刪除按鈕,只需要把按鈕調用這行代碼

qDeleteAll(this->mTree->selectedItems());