如何在Qt中迭代QTreeWidgetItem的子项

时间:2017-02-01 23:36:14

标签: qt iterator qtreewidget

Qt提供QTreeWidgetItemIterator类来迭代树视图的项目。 甚至还有一个构造函数版本,它接受项目指针而不是视图。不幸的是,即使在这种情况下,迭代也会下降到最后一项。通常,这不是预期的行为。如果我从项目开始,我只想迭代它的孩子和孙子。当然,我可以在树上得到另一个循环来检查我是否没有超出起始项目,但这很难看。 有没有办法很好地做到这一点?

 QTreeWidgetItemIterator it(treeWidget);
        while (*it) {
            if ((*it)->text(0) == itemText)
                (*it)->setSelected(true);
            ++it;
        }

3 个答案:

答案 0 :(得分:1)

如果你有父项,那么只需循环其子项:

for (int i = 0; i < item->childCount (); i++)
{
    QTreeWidgetItem *child = item->child (i);
    // ... perform work here ...
}

我没有看到一个循环通过一个项目的孩子的迭代器,但实际上并不需要它。

答案 1 :(得分:0)

完整的示例:

QObject::connect(ui.treeWidget_2, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(treeWidget2_itemClickedButtonAction(QTreeWidgetItem*)));

void treeWidget2_itemClickedButtonAction(QTreeWidgetItem* item)
{
    Qt::CheckState state = item->checkState(0);
    setChildState(item, state);
}

void setChildState(QTreeWidgetItem* item, Qt::CheckState state) {
    for (int i = 0; i < item->childCount(); i++)
    {
        QTreeWidgetItem* child = item->child(i);
        child->setCheckState(0, state);
        if (child->childCount() > 0)
            setChildState(child, state);
    }
}

答案 2 :(得分:0)

有一个老问题,但我偶然发现。 @goug答案非常正确,并且没有任何开销(O(n)实际上是访问N个元素可以达到的最小值,它等效于迭代器解决方案)。但是,如果您不喜欢行索引(如我所做的那样),QTreeWidgetItemIterrator支持各种各样的filters,那么在大多数情况下,我写这样的内容就足够了:

QTreeWidget * tree;
QTreeWidgetItemIterator it(tree,QTreeWidgetItemIterator::HasChildren);

但是根据您提供的确切说明,我认为过滤器不可行,所以我会这样做

QTreeWidgetItemIterator it(treeWidget);
        while (*it) {
            while ((*it)->parent() && (*it)->parent()->parent()
                &&(*it)->parent()->parent()->parent())
                ++it; //while item has grand-grandparent skip it 
            //do things
            ++it;
        }