C++ 带QTreeWidget的ExtendedSelection在删除时崩溃

C++ 带QTreeWidget的ExtendedSelection在删除时崩溃,c++,qt,qt4.8,C++,Qt,Qt4.8,我正在使用QTreeWidget: mTreeWdg->setSelectionMode(QAbstractItemView::ExtendedSelection) mTreeWdg->setSelectionBehavior(QAbstractItemView::SelectRows) 并具有删除树中所有选定项的功能。当我点击每一个,它的工作很好。但是,当我通过单击“第一个”、“结束”和“最后一个”来选择项目时,它会删除第一个项目,然后崩溃 OnBtnClickedDelete(){ QLis

我正在使用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);
}
}}}
OnBtnClickedDelete(){
QList list=mTree->selectedItems();
QList::迭代器it;
for(it=list.begin();it!=list.end();it++)
{
尝试
{  
QTreeWidgetItem*当前_项=*它;
如果(当前_项!=0)
{
int ind=current_item->data(0,Qt::UserRole).toInt();
如果(ind>0)
{
如果(MyMessageBox(
tr(“您确定要吗?”\
“是否删除此项?”),
QMessageBox::问题,
QMessageBox::Yes | QMessageBox::No)==QMessageBox::Yes)
{
Mdro.mDelete(ind-1);
mSth.Clear();
此->刷新树();
启用所有控制(错误);
如果(this->mTree->topLevelItemCount()==1)
{             
启用按钮(错误);
设置_启用(mButtonGenerate,true);
设置_启用(mButtonNew,true);
}
}
}            
}    
}
捕获(标准::异常&e)
{
默认异常处理程序(e);
}
}}}

使用这个,我假设您选择了一些项目,然后单击一个删除按钮,只需让按钮调用这行代码即可

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

什么是mPro?mSth呢?当然,如果更改QTreeWidget层次结构(
this->RefreshTree()
),当前迭代器将无效。。。也许你需要一个“休息”,但为什么当我用鼠标点击多个项目时,这个工作?如果我单击3个不同的项目,它会删除所有项目,并尝试将RefreshTree和以下行从循环中删除。迭代时不要刷新树小部件。如果不想在不删除的情况下刷新树,请使用bool变量。