Получение списка QTreeWidgetItem снова из QTreeWidget

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

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

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


person Patrick Bassut    schedule 03.04.2012    source источник


Ответы (3)


Поскольку вы имеете дело с деревом, 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) );
}
person Chris    schedule 03.04.2012
comment
Спасибо чувак, мне точно поможет. Я не могу протестировать его запись сейчас, но я прочитал документацию по методам, которую вы использовали, и это имеет смысл. Спасибо - person Patrick Bassut; 03.04.2012

Код ниже написан на 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
person nullstellensatz    schedule 25.01.2015

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

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