一、迭代QTreeWidget的所有节点

  • 使用QTreeWidgetItemIterator
  • 迭代器将按照预先排序的遍历顺序遍历项目,从而在继续访问子节点之前先访问父节点。

例如,下面的代码示例是树中的每一项,根据用户指定的搜索字符串检查第一列中的文本:

  1. QTreeWidgetItemIterator it(treeWidget);
  2. while (*it) {
  3. if ((*it)->text(0) == itemText)
  4. (*it)->setSelected(true);
  5. ++it;
  6. }

参考Qt document的QTreeWidgetItemIterator API https://doc.qt.io/qt-5/qtreewidgetitemiterator.html#QTreeWidgetItemIterator

注:

  • 该方法好像不能迭代某个子节点下的所有节点

二、迭代QTreeWidget某个节点下的所有子节点

  • 思路是使用tree的层序遍历
  • 将选中的节点添加到队列
  • 然后取队列最前的元素获取它的孩子节点
    • 如果孩子节点里有它的孩子节点,则将该节点添加到队列中,然后保存该节点显示的text
    • 如果孩子节点没有子节点,则直接保存该节点显示的text
  • pop队列中最前的元素 ```cpp // 隐藏tree的header // ui->treeWidget->header()->hide(); // 信号槽,双击事件 // connect(ui->treeWidget, &QTreeWidget::doubleClicked, this, &Widget::treeItemIter);

void Widget::treeItemIter(const QModelIndex&) { // 当前选中的节点 QTreeWidgetItem item = ui->treeWidget->currentItem(); // 存储tree item显示的文本 QSet itemsText; // 存储含孩子节点的节点 std::queue<QTreeWidgetItem> itemsQueue;

  1. // 如果是根节点就不添加(如果需要根节点去掉判断)
  2. if (item->parent() != nullptr) {
  3. itemsText.insert(item->text(0));
  4. }
  5. // 将根节点添加进队列
  6. itemsQueue.push(item);
  7. // 队列不为0时便一直循环
  8. while (itemsQueue.size() != 0) {
  9. // 取队列中最前面的节点
  10. QTreeWidgetItem* currentItem = itemsQueue.front();
  11. // 获取该节点的孩子节点的数量,如果不为0迭代它的孩子节点;若为0,直接添加该item的text到set中
  12. int childCount = currentItem->childCount();
  13. if (childCount != 0) {
  14. for (int i = 0; i < childCount; i++) {
  15. itemsText.insert(currentItem->child(i)->text(0));
  16. // 如果这个孩子节点还有子节点,则将该节点添加到Queue中
  17. if (currentItem->childCount() != 0) {
  18. itemsQueue.push(currentItem->child(i));
  19. }
  20. }
  21. } else {
  22. itemsText.insert(currentItem->text(0));
  23. }
  24. // 移除队列中已处理的最前的元素
  25. itemsQueue.pop();
  26. }
  27. // 打印结果
  28. qDebug() << itemsText;

} ``` image.png