Получение списка QTreeWidgetItem снова из QTreeWidget - PullRequest
5 голосов
/ 03 апреля 2012

Как мне это сделать? На самом деле моя главная цель - узнать, какой флажок в QTreeWidget отмечен. Но это я могу сделать, если вы, ребята, поможете мне с этим. Ну, я не могу найти метод, который снова дает мне QList<QTreeWidgetItem *>, чтобы я мог пройтись по всему списку и проверить, отмечены ли флажки (странное предложение, да?). QTreeWidget::selectedItems() не делает то, что я хочу. На самом деле он получает выбранный элемент (который может быть только один. Поэтому я не знаю, что здесь означает itemS. В любом случае, я могу ошибаться).

Моя главная цель СЕЙЧАС: пройти через QTreeWidget возможность делать все, что я хочу, с его предметами.

Заранее спасибо.

Ответы [ 3 ]

21 голосов
/ 03 апреля 2012

Поскольку вы имеете дело с деревом, API предназначен для предоставления вам доступа к QTreeWidgetItem в древовидной структуре. Таким образом, не существует прямого способа просто получить доступ к каждому QTreeWidgetItem напрямую через API Qt. Однако есть два способа сделать это:

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) );
}
4 голосов
/ 25 января 2015

Код ниже написан на Python, но его можно легко перевести на C ++. У меня была точно такая же проблема, как описанная в вопросе, но я использовал PySide (привязка Python Qt).

Если вы хотите получить список всех QTreeWidgetItem для данного элемента (включая сам этот элемент), используйте первую функцию. Чтобы получить список всех 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
2 голосов
/ 29 ноября 2017

Если вы хотите получить список всех QTreeWidgetItem в QTreeWidget, вы можете сделать

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