If-else条件处于循环中:将来的迭代将覆盖以前的迭代结果

时间:2019-05-22 08:58:08

标签: c++ qt

我尝试在selectedItem的列表中突出显示items及其子对象。

const QList<Item *> items = /* ... */;
Item *selectedItem = /* ... */;

Q_FOREACH( Item *item, items ) {
    if ( selectedItem == item ) {
        item->setHighlightEnabled(true); // Highlight selected item
    } else {
        item->setHighlightEnabled(false); // De-highlight other items
    }
}

item->setHighlightEnabled方法对子代递归执行相同的操作:

void Item::setHighlightEnabled(bool enabled)
{
    if (enabled) {
        /* highlight item */
    } else {
        /* de-highlight item */
    }

    // Go through all children and highlight them too
    Q_FOREACH (Item *child, children())
        child->setHighlightEnabled(enabled);    

}

工作正常,但存在错误。我们遍历所有项目。选择父级后,父级及其子级会突出显示。但是然后循环继续遍历孩子。由于未选择子项,因此将其取消突出显示(在先前的循环迭代中覆盖突出显示)。我想知道修复它的最佳实践是什么。

2 个答案:

答案 0 :(得分:3)

据我了解您的问题,您可以进行for循环。在第一个中,您取消突出显示所有元素。第二个按原样保留,一旦找到所选项目,就用break;语句停止它。

答案 1 :(得分:2)

首先取消突出显示所有内容,然后突出显示当前选择。

如果selectedItem已经是您要突出显示的唯一元素的指针,则无需搜索它,只需要:

Q_FOREACH (Item *item, items)
    item->setHighlightEnabled(false);
selectedItem->setHighlightEnabled(true)