Как получить правильные данные от QSortFilterProxyModel PyQt

У меня есть QTreeView с QSortFilterProxyModel. Когда я нажимаю на любой элемент представления, это печатает индекс из строки, по которой щелкнули. До и после установки фильтра он печатает один и тот же индекс.

Мне нужно это для removeRow(), но когда я ставлю индекс, он удаляет неверный элемент из списка:/

Как удалить правильно выбранную строку?

Пример:

Не отсортировано

 ITEM 1
 ITEM 2 -> Click: Print ITEM2 and this is removed
 ITEM 3
 ITEM 4

Сортировка

ITEM 2
ITEM 4 -> Click: Print ITEM2 and ITEM2 is removed :/

init
    self.menuIndex = None

    self.mModelMenu = QtGui.QStandardItemModel(0, 4, self)
    self.mModelMenu.setHeaderData(0, QtCore.Qt.Horizontal, "Id")
    self.mModelMenu.setHeaderData(1, QtCore.Qt.Horizontal, "Descripcion")
    self.mModelMenu.setHeaderData(2, QtCore.Qt.Horizontal, "Categoria")
    self.mModelMenu.setHeaderData(3, QtCore.Qt.Horizontal, "Cantidad")

    self.mProxyModelMenu = QtGui.QSortFilterProxyModel()
    self.mProxyModelMenu.setDynamicSortFilter(True)
    self.mProxyModelMenu.setSourceModel(self.mModelMenu)

    self.mTreeView = QtGui.QTreeView()
    self.mTreeView.setRootIsDecorated(False)
    self.mTreeView.setAlternatingRowColors(True)
    self.mTreeView.setModel(self.mProxyModelMenu)
    self.mTreeView.setSortingEnabled(True)
    self.mTreeView.sortByColumn(0, QtCore.Qt.AscendingOrder)
    self.mTreeView.resizeColumnToContents(0)
    self.mTreeView.clicked.connect(self.getIndex)

    mPushButton1 = QtGui.QPushButton("Borrar")
    mPushButton1.clicked.connect(self.newInMenu)

def getIndex()
    print(index.row())
    self.menuIndex = index.data(index.row())
    print(index.data(index.row()))
    # print(index.data(QtCore.Qt.DisplayRole))

def removeFromMenu(self):
    toRemove = self.menuIndex
    self.mModelMenu.removeRow(0) #this delete the last row, but i need delete current selected row

person Christopher Vivar Vivar    schedule 09.08.2015    source источник
comment
Нам нужно увидеть код.   -  person cdonts    schedule 10.08.2015
comment
сейчас вставлю код :)   -  person Christopher Vivar Vivar    schedule 10.08.2015
comment
Почему вы используете removeRow(0), если хотите удалить выбранный?   -  person cdonts    schedule 10.08.2015


Ответы (2)


Самый простой способ работы с прокси-моделью — избегать работы с исходной моделью и по возможности использовать QSortFilterProxyModel методы.

Например. просто вызывая removeRow в прокси-модели:

def removeFromMenu(self)
    selIndexes = self.mTreeView.selectedIndexes()
    if len(selIndexes):
        first = selIndexes[0]
        self.mProxyModelMenu.removeRow(first.row(), first.parent())

должен сделать трюк.

person sebastian    schedule 10.08.2015
comment
Частично работает. После перемешивания содержимого исключается неправильный ряд. Пришлось внести изменение, но удаляет индекс в отрицательном порядке - person Christopher Vivar Vivar; 10.08.2015
comment
Я добавил аргумент parent, который должен быть предоставлен для TreeModels. - person sebastian; 10.08.2015
comment
Большое спасибо, это работает отлично, теперь мне просто нужно получить содержимое столбца ID ;). Я так понимаю, что работаю с ProxyModel, я еще новичок в Qt. Спасибо за помощь :) - person Christopher Vivar Vivar; 10.08.2015
comment
По той же логике я получил данные из индекса, это идеально :D! - person Christopher Vivar Vivar; 10.08.2015

При использовании QSortFilterProxyModel у вас есть два типа индексов: прокси-индексы (порядок, который вы видите в представлении) и исходные индексы из исходной модели (порядок в QStandardItemModel).

Представление предоставит вам прокси-индекс, и вы сможете вернуться к исходному индексу с помощью mapToSource, например:

#get first selected index
proxy_index = self.mTreeView.selectedIndexes()[0] 

#convert 
source_index=self.mProxyModelMenu.mapToSource(proxy_index)

#delete row in source model
self.mModelMenu.removeRow(source_index.row())
person Mel    schedule 10.08.2015
comment
Эта реализация выдает ошибку QSortFilterProxyModel: индекс передан из неправильной модели в mapFromSource. - person Christopher Vivar Vivar; 10.08.2015