从QTreeWidget再次获取QTreeWidgetItem列表

11

我该怎么做呢? 实际上,我的主要目标是获得 QTreeWidget 中哪个复选框被选中。但我需要你们帮忙。 然而,我找不到一个能够再次给我 QList<QTreeWidgetItem *> 的方法,这样我就可以遍历整个列表并检查复选框是否被选中(奇怪的句子,对吧?)。 QTreeWidget::selectedItems() 不做我想要的事情。它实际上获取了所选项(可能只有一项。所以我不知道这里的 itemS 是什么意思。不管怎样,我可能是错的)。

我现在的主要目标是:浏览 QTreeWidget 并能够随心所欲地处理其中的项。

提前感谢。

3个回答

29

由于你正在处理树形结构,API旨在向你提供对QTreeWidgetItem在树形结构中的访问。因此,没有直接的方法可以通过Qt的API直接访问每个单独的QTreeWidgetItem。但是,有两种方法可以实现这一点:

1)如果你所有的项目(或你关心的所有项目)都是“顶级”的,那么你可以像这样操作:

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

   // Do something with item ...
}

2) 如果需要访问树中的每个项目以及其子项,则可能需要采用递归方法:

doStuffWithEveryItemInMyTree( tree->invisibleRootItem() );

void doStuffWithEveryItemInMyTree( QTreeWidgetItem *item )
{
    // Do something with item ...

    for( int i = 0; i < item->childCount(); ++i )
        doStuffWithEveryItemInMyTree( item->child(i) );
}

谢谢,这肯定会帮助我。我现在无法测试它,但我阅读了你使用的方法文档,它非常合理。谢谢。 - Patrick Bassut

10
如果您想要获取QTreeWidget中所有QTreeWidgetItem的列表,可以执行以下操作:
QList<QTreeWidgetItem *> items = ui->treeWidget->findItems(
            QString("*"), Qt::MatchWrap | Qt::MatchWildcard | Qt::MatchRecursive);

7
下面的代码是Python语言编写的,但可以轻松地转换为C ++。我遇到了与问题描述中完全相同的问题,但我正在使用PySide(Python Qt绑定)。
如果要获取给定项下所有QTreeWidgetItem(包括该项本身)的列表,请使用第一个函数。要获取树中所有QTreeWidgetItem的列表,请调用第二个函数。
def get_subtree_nodes(tree_widget_item):
    """Returns all QTreeWidgetItems in the subtree rooted at the given node."""
    nodes = []
    nodes.append(tree_widget_item)
    for i in range(tree_widget_item.childCount()):
        nodes.extend(get_subtree_nodes(tree_widget_item.child(i)))
    return nodes

def get_all_items(tree_widget):
    """Returns all QTreeWidgetItems in the given QTreeWidget."""
    all_items = []
    for i in range(tree_widget.topLevelItemCount()):
        top_item = tree_widget.topLevelItem(i)
        all_items.extend(get_subtree_nodes(top_item))
    return all_items

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