Я пытаюсь выбрать элементы представления абстрактных элементов в 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
Вы очищаете выбор на каждой итерации.
Заменить:
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) {
Других решений пока нет …