10

我怎么做?实际上,我的主要目标是检查中的哪个复选框QTreeWidget。但是,如果你们帮我解决这个问题,我可以做到这一点。好吧,我找不到给我的方法,QList<QTreeWidgetItem *>所以我可以遍历列表并检查复选框是否被选中(奇怪的句子,嗯?)。 QTreeWidget::selectedItems()不做我想做的事。它实际上得到了选定的项目(可以只是一个。所以我不知道 itemS 在这里是什么意思。无论如何我可能是错的)。

我现在的主要目标是:通过QTreeWidget能够对其中的项目做任何我想做的事情。

提前致谢。

4

3 回答 3

27

由于您正在处理一棵树,因此 API 旨在让您访问QTreeWidgetItem树结构中的 s。因此,没有直接的方法可以简单地QTreeWidgetItem通过 Qt 的 API 直接访问每一个。但是,有两种方法可以做到这一点:

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) );
}
于 2012-04-03T02:20:37.700 回答
9

下面的代码是用 Python 编写的,但它可以很容易地翻译成 C++。我遇到了与问题中描述的完全相同的问题,但我使用的是 PySide(Python Qt 绑定)。

如果要获取QTreeWidgetItem给定项目(包括该项目本身)下所有 s 的列表,请使用第一个函数。要获取QTreeWidgetItem树中所有 s 的列表,请调用第二个函数。

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
于 2015-01-25T09:25:40.030 回答
7

如果您想获取 QTreeWidget 中所有 QTreeWidgetItem 的列表,您可以执行

QList<QTreeWidgetItem *> items = ui->treeWidget->findItems(
            QString("*"), Qt::MatchWrap | Qt::MatchWildcard | Qt::MatchRecursive);
于 2017-11-29T16:32:28.337 回答