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

use*_*291 5 c++ qt

我尝试在的列表中突出显示a 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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);    

}
Run Code Online (Sandbox Code Playgroud)

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

mol*_*ilo 3

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

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

Q_FOREACH (Item *item, items)
    item->setHighlightEnabled(false);
selectedItem->setHighlightEnabled(true)
Run Code Online (Sandbox Code Playgroud)