2012-04-03 43 views
4

我该怎么做? 其实我的主要目标是获得QTreeWidget中的哪个复选框被选中。但是,如果你们帮助我解决这个问题,我可以做到这一点。 那么,我找不到一种方法,再次给了我QList<QTreeWidgetItem *>,所以我可以遍历列表并检查复选框是否被选中(奇怪的句子,呵呵?)。 QTreeWidget::selectedItems()不会做我想要的。它实际上得到了选定的项目(可能只有一个,所以我不知道这里的项目是什么意思,反正我可能是错的)。从QTreeWidget再次获取QTreeWidgetItem列表

我现在的主要目标是:通过QTreeWidget可以做任何我想要的物品。

在此先感谢。

回答

19

由于您正在处理树,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)); 
} 
+0

感谢的人,它会帮助我肯定的。我现在无法测试它,但是我使用了您使用的方法文档,这非常合理。谢谢 – 2012-04-03 02:46:58

+0

是的,它确实有效。非常感谢你。 – 2012-04-04 02:55:43

4

下面的代码是在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 
1

如果你想获得的所有QTreeWidgetItem的列表中QTreeWidget你可以做一个

QList<QTreeWidgetItem *> items = ui->treeWidget->findItems(
      QString("*"), Qt::MatchWrap | Qt::MatchWildcard | Qt::MatchRecursive);