如何获取QTreeWidget的项目数

时间:2015-03-03 10:16:42

标签: c++ qt qtreewidget qtreewidgetitem

我创建了一个QTreeWidget,我试图列出所有显示的项目。

如果项目有子项但未展开,我不想进入项目内部。它确实得到了我在树上可以看到的物品数量。

我试过了:

   for( int i = 0; i < MyTreeWidget->topLevelItemCount(); ++i )
    {
       QTreeWidgetItem *item = MyTreeWidget->topLevelItem(i);
       ...

但这只给了我topLevelItem,我想要所有我能看到的东西。在示例中,我应该能够计算14个项目

enter image description here

2 个答案:

答案 0 :(得分:4)

您可以编写一个递归函数,该函数将在层次结构上运行并计算所有可见项。例如:

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);

答案 1 :(得分:0)

我自己为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