Qt提供QTreeWidgetItemIterator类来迭代树视图的项目。 甚至还有一个构造函数版本,它接受项目指针而不是视图。不幸的是,即使在这种情况下,迭代也会下降到最后一项。通常,这不是预期的行为。如果我从项目开始,我只想迭代它的孩子和孙子。当然,我可以在树上得到另一个循环来检查我是否没有超出起始项目,但这很难看。 有没有办法很好地做到这一点?
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
if ((*it)->text(0) == itemText)
(*it)->setSelected(true);
++it;
}
答案 0 :(得分:1)
如果你有父项,那么只需循环其子项:
for (int i = 0; i < item->childCount (); i++)
{
QTreeWidgetItem *child = item->child (i);
// ... perform work here ...
}
我没有看到一个循环通过一个项目的孩子的迭代器,但实际上并不需要它。
答案 1 :(得分:0)
完整的示例:
QObject::connect(ui.treeWidget_2, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(treeWidget2_itemClickedButtonAction(QTreeWidgetItem*)));
void treeWidget2_itemClickedButtonAction(QTreeWidgetItem* item)
{
Qt::CheckState state = item->checkState(0);
setChildState(item, state);
}
void setChildState(QTreeWidgetItem* item, Qt::CheckState state) {
for (int i = 0; i < item->childCount(); i++)
{
QTreeWidgetItem* child = item->child(i);
child->setCheckState(0, state);
if (child->childCount() > 0)
setChildState(child, state);
}
}
答案 2 :(得分:0)
有一个老问题,但我偶然发现。 @goug答案非常正确,并且没有任何开销(O(n)实际上是访问N个元素可以达到的最小值,它等效于迭代器解决方案)。但是,如果您不喜欢行索引(如我所做的那样),QTreeWidgetItemIterrator
支持各种各样的filters,那么在大多数情况下,我写这样的内容就足够了:
QTreeWidget * tree;
QTreeWidgetItemIterator it(tree,QTreeWidgetItemIterator::HasChildren);
但是根据您提供的确切说明,我认为过滤器不可行,所以我会这样做
QTreeWidgetItemIterator it(treeWidget);
while (*it) {
while ((*it)->parent() && (*it)->parent()->parent()
&&(*it)->parent()->parent()->parent())
++it; //while item has grand-grandparent skip it
//do things
++it;
}