如何获取QTreeWidget的项目数量

6
我创建了一个QTreeWidget,我试图列出所有显示的项目。
如果项目有子项但未展开,则不想进入项目内部。我真正需要的是可以在树中看到的项目数量。
我已经尝试过:
   for( int i = 0; i < MyTreeWidget->topLevelItemCount(); ++i )
    {
       QTreeWidgetItem *item = MyTreeWidget->topLevelItem(i);
       ...

但是这只给我返回了顶层项,而我想要看到所有的项。在这个例子中,我应该能够数出14个项目。

我必须编写一个递归函数,它将遍历所有项目。 - vahancho
离题问题:这是一个带有自定义主题的GNU/Linux操作系统还是您能够在QTreeWidget中更改文件夹图标? - Jacob Krieg
图标是自定义的 :-). 我直接使用 setIcon 指向我想要的图标。 - Seb
@vahancho 没有其他办法,只有一个简单的方法吗? - Seb
如果你只有一个固定(且少量)级别,你可以使用一个函数来完成它,否则你需要使用递归函数。但我认为这已经是一个相当简单的方式了。 - Bowdzone
2个回答

6
您可以编写一个递归函数,遍历整个层次结构并计算所有可见项的数量。例如:
int treeCount(QTreeWidget *tree, QTreeWidgetItem *parent = 0)
{
    int count = 0;
    if (parent == 0) {
        int topCount = tree->topLevelItemCount();
        for (int i = 0; i < topCount; i++) {
            QTreeWidgetItem *item = tree->topLevelItem(i);
            if (item->isExpanded()) {
                count += treeCount(tree, item);
            }
        }
        count += topCount;
    } else {
        int childCount = parent->childCount();
        for (int i = 0; i < childCount; i++) {
            QTreeWidgetItem *item = parent->child(i);
            if (item->isExpanded()) {
                count += treeCount(tree, item);
            }
        }
        count += childCount;
    }
    return count;
}

使用方法:

QTreeWidget tw;
// Add items
[..]
int visibleItemsCount = treeCount(&tw);

2
我刚遇到了这个问题,是在使用PyQt时。实际上有一个更简单的解决方案,你只需要使用QTreeWidgetItemIterator(它已经循环遍历了树中的所有项目,正如其名称所示)。我不知道C++,所以这里提供我的Python解决方案,但理论显然是相同的。你想要迭代QTreeWidget,并计算任何展开的项。即:
def count_tems(self):
    count = 0
    iterator = QtGui.QTreeWidgetItemIterator(self) # pass your treewidget as arg
    while iterator.value():
       item = iterator.value()

        if item.parent():
            if item.parent().isExpanded():
                count +=1
        else:
            # root item
            count += 1
        iterator += 1
    return count

9
叹气 没有什么比查找一个问题,然后发现自己两年前已经找到了完全相同的答案更让人欣慰了... - Spencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接