Вы используете findItems
неправильно, он уже может вернуть нужный элемент, просто передав значение, которое вы ищете. Если вы называете это так, как вы делаете сейчас, вы просматриваете свои элементы как минимум два раза, так как findItems
должен перебрать все элементы, чтобы найти те, которые соответствуют вашему шаблону, в вашем случае все элементы соответствуют, тогда вы итерация возвращенных предметов снова, чтобы найти sessionId
.
void NetworkManager::removeSessionFromModel (QStandardItemModel *model, int sessionId) {
auto items = model->findItems(QString::number(sessionId));
if (!items.empty()) {
auto row = items.first()->index().row();
model->removeRow(row);
}
}
В качестве альтернативы вы можете использовать метод match , так как findItems
использует его внутри, поэтому вы избегаете выделять StandardItem
просто для получения его индекса. Также match
возвращает сразу после того, как найдено количество элементов, соответствующих шаблону, в этом случае значение sessionId
, поэтому он не всегда повторяет все элементы; это более эффективно. Очевидно, что если значение не найдено после итерации всех элементов, возвращается пустой список.
auto start = model->index(0, 0);
auto indexes = model->match(start, Qt::UserRole + 1, QString::number(sessionId), 1, Qt::MatchExactly);
if (!indexes.empty()) {
auto row = indexes.first().row();
model->removeRow(row);
}