一、迭代QTreeWidget的所有节点
- 使用QTreeWidgetItemIterator
- 迭代器将按照预先排序的遍历顺序遍历项目,从而在继续访问子节点之前先访问父节点。
例如,下面的代码示例是树中的每一项,根据用户指定的搜索字符串检查第一列中的文本:
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
if ((*it)->text(0) == itemText)
(*it)->setSelected(true);
++it;
}
参考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
// 如果是根节点就不添加(如果需要根节点去掉判断)
if (item->parent() != nullptr) {
itemsText.insert(item->text(0));
}
// 将根节点添加进队列
itemsQueue.push(item);
// 队列不为0时便一直循环
while (itemsQueue.size() != 0) {
// 取队列中最前面的节点
QTreeWidgetItem* currentItem = itemsQueue.front();
// 获取该节点的孩子节点的数量,如果不为0迭代它的孩子节点;若为0,直接添加该item的text到set中
int childCount = currentItem->childCount();
if (childCount != 0) {
for (int i = 0; i < childCount; i++) {
itemsText.insert(currentItem->child(i)->text(0));
// 如果这个孩子节点还有子节点,则将该节点添加到Queue中
if (currentItem->childCount() != 0) {
itemsQueue.push(currentItem->child(i));
}
}
} else {
itemsText.insert(currentItem->text(0));
}
// 移除队列中已处理的最前的元素
itemsQueue.pop();
}
// 打印结果
qDebug() << itemsText;
} ```