Программно выбирать QModelIndexes в QAbstractItemView

Я пытаюсь выбрать элементы представления абстрактных элементов в Qt, учитывая их строковые значения. Я уже написал функцию, которая находит любую QModelIndex на основе его содержимого строки.

Я сейчас пытаюсь поставить все эти QModelIndexЕсли я найду один выбор. Мой метод подписи:

    // Will select all items that contain any of the strings
// given by 1st argument
virtual void selectItems(const QStringList&) override;

Моя реализация выглядит так (но не работает должным образом):

void QAbstractItemViewResult::selectItems(const QStringList& list)
{
if(list.size() > 0) {
QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::ClearAndSelect;
QItemSelection selection;
Q_FOREACH(const QString text, list) {
// Find index by string is a method I implemented earlier
// The method works correctly
QModelIndex index(findIndexByString(targetView_, list[0]));
if(index.isValid()) {
// This is an attempt to add model indx into selection
selection.select(index, index);
}
}
// When the selection is created, this should select it in index
targetView_->selectionModel()->select(selection, flags);
}
}

Проблема в том, что этот код всегда выбирает только первый элемент в списке, например. за "B1","C1","A1" это выглядит так:

Описание изображения

В таблице включено многократное выделение:

Описание изображения

Итак, как мне правильно выбрать несколько элементов программно? Если вам нужно findIndexByString, Это можно найти здесь: https://github.com/Darker/qt-gui-test/blob/master/results/QAbstractItemViewResult.cpp#L5

1

Решение

Вы очищаете выбор на каждой итерации.

Заменить:

QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::ClearAndSelect;

от:

QItemSelectionModel::SelectionFlags flags = QItemSelectionModel::Select;

РЕДАКТИРОВАТЬ: Вы передаете list[0] вместо text:

findIndexByString(targetView_, list[0])

Кстати, вы должны использовать постоянная ссылка в вашем цикле:

Q_FOREACH(const QString &text, list) {

Или нативная версия, если вы используете C ++ 11 или выше:

for (const QSring &text : list) {
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]