如果只是单纯的遍历 QTreeWidget,可以直接使用 QTreeWidgetItemIterator 迭代器实现:
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
qDebug() << (*it)->text(0);
++it;
}
QTreeWidgetItemIterator 在构造时支持传入 QTreeWidget 和 QTreeWidgetItem。然而在传入 QTreeWidgetItem 进行遍历后,你会发现它不仅会遍历当前 QTreeWidgetItem 的子项,还会遍历其后的所有 QTreeWidgetItem 及子项。
那么如何仅遍历当前 QTreeWidgetItem 的子项呢?思路是在遍历的同时记录当前 QTreeWidgetItem 的子项个数,在子项都遍历完了之后跳出遍历。实现代码如下:
// 该代码修改自 https://stackoverflow.com/a/32669123/14848361
QTreeWidgetItem *targetItem = topLevelItem(0); // 要遍历所有子项的 QTreeWidgetItem
QTreeWidgetItemIterator it(targetItem);
int nodesCount = 1; // 根节点只有一个子节点
for (int i = 0; i < nodesCount; ++i)
{
qDebug() << (*it)->text(0);
nodesCount += (*it)->childCount(); // 更新下层子节点的数目
++it;
}