Почему мой метод itemFromIndex QStandardItemModel возвращает None? (индекс неверный)

Я пытаюсь создать список с флажками, который проверяет выбранные поля при нажатии клавиши ввода/возврата. Я делаю это с переопределением фильтра событий для моего MainWindow (да, я должен создать подкласс, но я не мог заставить это работать)

В фильтре событий я получаю значение None, возвращаемое методом itemFromIndex, хотя я только что без проблем передал индекс через .isValid(). Очевидно, я что-то упускаю, но я не могу понять - он смотрит на совершенно другие индексы? модель не обновляется?

Любые советы по альтернативным подходам приветствуются

Это метод, который я использую для заполнения модели (QStandardItemModel) элементами, он вызывается только при загрузке файла.

    def update_siNLV(self,names,model):

        model.clear()

        for name in names:            
            item = Qg.QStandardItem(name)
            item.setCheckState(Qc.Qt.Unchecked)
            item.setCheckable(True)
            model.appendRow(item)

Это из метода init, где я создаю переменную для модели выбора и устанавливаю фильтр событий в моем QListView.

    self.sigInSelection = self.siNLV.selectionModel()
    self.siNLV.installEventFilter(self)

Метод eventFilter выглядит так, и фильтрующая часть метода работает (я заставил его печатать выбранные индексы нажатием клавиши ввода)

    def eventFilter(self,receiver,event):
        if event.type() == QtCore.QEvent.KeyPress:
            if event.key() == QtCore.Qt.Key_Return or event.key() == Qc.Qt.Key_Enter:

                indexes = self.sigInSelection.selectedIndexes()

                for index in indexes:
                    if index.isValid():                        
                        print(str(index.row())+" "+str(index.column()))                                   
                        item = self.sigInModel.itemFromIndex(index)
                        item.setCheckState(qtCore.Qt.Checked)                     
                return True

    return super(form,self).eventFilter(receiver,event)

person Bertramp    schedule 02.09.2016    source источник
comment
Похоже, вы проверили, что index является допустимым индексом в sigInSelection - нет априорной причины, по которой он также должен быть допустимым индексом в sigInModel.   -  person Martin Bonner supports Monica    schedule 02.09.2016
comment
ты прав. Таким образом, несмотря на то, что sigInModel настроен на просмотр списка, он не использует общие индексы со встроенной моделью выбора siNLV? Тогда как мне связать выборки с моими данными?   -  person Bertramp    schedule 02.09.2016
comment
Я не вижу, где вы безуспешно вызываете itemFromIndex, так как вы говорите, что eventFilter работает. Вероятно, нам нужно увидеть немного больше кода. MVCE может помочь.   -  person strubbly    schedule 02.09.2016
comment
Я отредактировал вопрос, чтобы устранить недоразумения. это itemFromIndex часть фильтра событий, которая не работает   -  person Bertramp    schedule 02.09.2016
comment
Единственные важные данные в index здесь — это строка и столбец, которые вы уже печатаете, а index.model(). Убедитесь, что оно имеет ожидаемое значение (т. е. должно равняться sigInModel). Если все эти три значения верны, то itemFromindex должен работать.   -  person strubbly    schedule 02.09.2016
comment
Кажется, я не могу получить фактическую возвращенную модель, но тип - QSortFilterProxyModel, что, я думаю, имеет смысл, поскольку я применил его к siNLV, но совершенно забыл об этом. Я думаю, мне нужно использовать функцию mapToSource, чтобы получить индексы модели предметов?   -  person Bertramp    schedule 02.09.2016


Ответы (1)


Как обсуждалось в комментариях:

Индексы, возвращаемые QItemSelectionModel.selectedIndexes(), поступают из представления и относятся к связи между представлением и его непосредственной моделью. Идентификацию этой модели можно найти, вызвав QModelIndex.model(), и в этом случае это не та модель, которая вам нужна: вместо этого это прокси-модель, которая находится между желаемым QStandardItemModel и представлением.

Чтобы получить нужную модель, вам нужно использовать QAbstractProxyModel.mapToSource(). Таким образом, вы можете использовать код примерно так:

source_index = self.proxy.mapToSource(index)
item = self.sigInModel.itemFromIndex(source_index)

В более общем случае вы можете пройти через произвольную структуру прокси и избежать этого жестко запрограммированного использования одного известного прокси с помощью кода, например:

proxy_model = index.model()
while proxy_model != self.sigInModel:
    index = proxy_model.mapToSource(index)
    proxy_model = index.model()
item = self.sigInModel.itemFromIndex(index)

Но это, вероятно, излишне в этом случае, когда вы знаете, что есть простой единственный прокси.

person strubbly    schedule 05.09.2016