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