2016-12-08 5 views
1

У меня есть ComboBox и прикрепленный к нему QSortFilterProxyModel, который упорядочивает элементы по алфавиту.QSortFilterProxyModel: получить элемент или индекс исходной модели

исходная модель (QComboBox) представляет собой, например:

"С", "А", "Д", "Б"

Отсортированная модель (QSortFilterProxyModel) принимает вид:

"А", "Б", "с", "Д"

Если я теперь выбрать "D" в отсортированном ComboBox, сигнал QCOM boBox :: currentIndexChanged (int) дает мне index = 3, но мне хотелось бы получить индекс относительно исходной модели, возможно, index = 2.

С другой стороны, мне также хотелось бы «Оригинальная модель» -> setCurrentIndex (idx). Но если, если я определяю idx = 2, в comboBox подсвеченная строка показывает «C», поскольку сортировка вида сортируется.

Как это решить?

ответ

3

Во-первых, вам нужно получить индекс в модели, отображаемой в поле со списком. Используйте для этого QAbstractItemModel::index. «Индекс», заданный полем со списком, является строкой.

Чтобы отобразить от индекса прокси к индексу источника и от индекса источника до индекса прокси, используйте QSortFilterProxyModel::mapToSource и mapFromSource соответственно.

Вид действует по индексам прокси-сервера, поэтому любые индексы, которые вы получаете из представления, должны быть сопоставлены с исходной моделью с использованием mapToSource. И наоборот, если вы работаете с индексами в исходной модели и хотите получить индекс в представлении, используйте mapFromSource.

т.д .:

connect(myComboBox, &QComboBox::currentIndexChanged, [=](int row){ 
    auto proxy = static_cast<QAbstractProxyModel*>(myComboBox->model()); 
    auto const proxyIndex = proxy->index(row, 0); 
    auto source = proxy->sourceModel(); 
    auto const sourceIndex = proxy->mapToSource(proxyIndex); 
    ... 
}); 
+0

@LucaDanieli Да. И, конечно же, 'QSortFilterProxyModel' ** - это **' QAbstractItemModel'! –

+0

Возможно ли, что QSortFilterProxyModel :: index (строка, 0) работает только в том случае, если в ComboBox выбрана строка? Я пытаюсь mComboBox-> setCurrentIndex (proxyIndex) через QModelIndex mIndex = mProxyModel-> index (modelIndex, 0); QModelIndex proxyRow = mProxyModel-> mapFromSource (mIndex); int proxyIndex = proxyRow.row(); К сожалению, int proxyIndex приходит «-1». ModelIndex, правда, правильный –

+0

Методы на модели будут работать независимо от того, что делает представление. Поэтому выбор не имеет значения. Пожалуйста, обновите вопрос, если у вас есть код, о котором нужно спросить. –

Смежные вопросы