2012-04-03 39 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);