Условие if-else в цикле: будущие итерации перезаписывают результаты предыдущих итераций - PullRequest
5 голосов
/ 22 мая 2019

Я пытаюсь выделить 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 ]

4 голосов
/ 22 мая 2019

Насколько я понимаю вашу проблему, вы могли бы сделать для цикла. В первом вы де-выделите все элементы. А второй вы оставляете как есть и просто останавливаете его с помощью оператора break;, как только он найдет выбранный элемент.

3 голосов
/ 22 мая 2019

Сначала выделите все, затем выделите текущий выбор.

Если selectedItem уже является указателем на единственный элемент, который вы хотите выделить, вам не нужно искать его, вам нужно только:

Q_FOREACH (Item *item, items)
    item->setHighlightEnabled(false);
selectedItem->setHighlightEnabled(true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...