如何在treewidget中选择多个项目并删除这些项目?

时间:2016-11-18 05:27:46

标签: linux qt qtreewidget

当我在treewidget中选择项目然后点击删除按钮时,它只是从treewidget中删除最顶层的项目 你能纠正这个代码吗?
此功能在单击按钮

时在connect语句中调用
void TableDockWidget::deleteGroup() {

QTreeWidgetItem *item = treeWidget->currentItem();

QTreeWidgetItem* nextItem = treeWidget->itemBelow(item);

if ( item == NULL ) return;

PeakGroup* group = getSelectedGroup(); //this function is using to                        //select items from treewidget

if ( group == NULL ) return;

PeakGroup* parentGroup = group->parent;

if ( parentGroup == NULL ) { //top level item

    deleteGroup(group); //this is using to delete group
} else if ( parentGroup && parentGroup->childCount() ) {    //this a child item
    if ( parentGroup->deleteChild(group) ) {
        QTreeWidgetItem* parentItem = item->parent();
        if ( parentItem ) {
            parentItem->removeChild(item);
            delete(item);
        }
    }
}
//show NextItem
if(nextItem) treeWidget->setCurrentItem(nextItem,0);
return;

}

//这里是选择项目的功能代码。

PeakGroup* TableDockWidget::getSelectedGroup() { 
QTreeWidgetItem *item = treeWidget->currentItem();
if (!item) return NULL;
QVariant v = item->data(0,Qt::UserRole);
PeakGroup*  group =  v.value<PeakGroup*>();
if ( group != NULL ) { return group; }
return NULL;

}

//正在删除组的功能代码

void TableDockWidget::deleteGroup(PeakGroup *groupX) {
qDebug() << "TableDockWidget::deleteGroup()";
if(!groupX) return;

int pos=-1;
for(int i=0; i < allgroups.size(); i++) {
    if ( &allgroups[i] == groupX ) {
        pos=i; break;
    }
}
if (pos == -1) return;

//qDebug() << "Delete pos=" << pos;
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
    QTreeWidgetItem* item = (*it);
    if (item->isHidden()) { ++it; continue; }
    QVariant v = item->data(0,Qt::UserRole);
    PeakGroup*  group =  v.value<PeakGroup*>();
    if ( group != NULL and group == groupX) {
        item->setHidden(true);

        //Deleteing
        allgroups.erase(allgroups.begin()+pos);
        int posTree = treeWidget->indexOfTopLevelItem(item);
        if (posTree != -1) treeWidget->takeTopLevelItem(posTree);
        break;
    }
    ++it;
}

for(unsigned int i = 0; i < allgroups.size(); i++) {
    allgroups[i].groupId = i + 1;
}
updateTable();
_mainwindow->getEicWidget()->replotForced();

}

1 个答案:

答案 0 :(得分:0)

PeakGroup* TableDockWidget::getSelectedGroup() { 
PeakGroup*  group;
QList<QTreeWidgetItem*>selected = treeWidget->selectedItems();
if(selected.size() == 0) return NULL;
Q_FOREACH (QTreeWidgetItem* item, selected) {
          QVariant v = item->data(0,Qt::UserRole);
           group =  v.value<PeakGroup*>();
          item->setHidden(true);
       }
if ( group != NULL ) { return group; }
else
return NULL;
}