我创建了一个QTreeWidget,我试图列出所有显示的项目。
如果项目有子项但未展开,我不想进入项目内部。它确实得到了我在树上可以看到的物品数量。
我试过了:
for( int i = 0; i < MyTreeWidget->topLevelItemCount(); ++i )
{
QTreeWidgetItem *item = MyTreeWidget->topLevelItem(i);
...
但这只给了我topLevelItem,我想要所有我能看到的东西。在示例中,我应该能够计算14个项目
答案 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