Доступ к исходному индексу в QAbstractTableModel из выбранной строки в QTableView - PullRequest
0 голосов
/ 17 апреля 2020

Я реализую GUI для программы python с использованием Qt5 и PySide2. У меня нет проблем с пониманием стороны Qt на C ++, поэтому не стесняйтесь указывать на ссылки Qt, не связанные с python.

У меня есть некоторые данные, которые я отображаю в QTableView с использованием подкласса QAbstractTableModel. Я также использую подкласс QSortFilterProxyModel для фильтрации своей таблицы и отображения только подмножества базовых данных, потому что это очень большой набор данных. Я предлагаю пользователю возможность отображать только часть этих данных в соответствии с некоторыми критериями. Все это работает очень хорошо.

Затем я настроил QTableView так, чтобы пользователь мог выбирать только полные строки:

self.ui.candidatesTable.setSelectionBehavior(QTableView.SelectRows)

И в объекте, обрабатывающем пользовательский интерфейс, я реализовал слот, который вызывается при изменении выбора в таблице:

@Slot(QItemSelection)
def handleSelectionChanged(self, item):
    hasSelection = self.ui.candidatesTable.selectionModel().hasSelection()
    if hasSelection:
        selectedRows = self.ui.candidatesTable.selectionModel().selectedRows()
        for row in selectedRows:
            print(row.row())

Моя проблема заключается в том, что значение, напечатанное print(row.row()), показывает индекс строки в отображаемых в данный момент строках . Если пользователь выбрал критерий фильтрации, который отображает только 5 строк из нескольких тысяч, а затем выбрал первую строку, print(row.row()) вернет 0, а не исходный индекс в базовом QAbstractTableModel.

Поэтому у меня следующий вопрос: как я могу получить доступ к исходному индексу в этой ситуации?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Основываясь на предыдущем ответе @ eyllanes c, я реализовал решение, используя selectedRows() вместо selectedIndexes(). Последний возвращает индексы для всех выбранных столбцов и строк, в то время как меня интересовали только строки:

@Slot(QItemSelection)
def handleSelectionChanged(self, item):
    hasSelection = self.ui.candidatesTable.selectionModel().hasSelection()
    if hasSelection:
        selectedRows = self.ui.candidatesTable.selectionModel().selectedRows()
        for row in selectedRows:
            proxy_model = self.ui.candidatesTable.model()
            row_index = proxy_model.mapToSource(row).row()
0 голосов
/ 17 апреля 2020

Необходимо сопоставить QModelIndex прокси-модели с исходной моделью, используя метод mapToSource ():

@Slot(QItemSelection)
def handleSelectionChanged(self, item):
    indexes = self.ui.candidatesTable.selectedIndexes()
    proxy_model = self.ui.candidatesTable.model()    

    rows = set()
    for index in indexes:
        si = proxy_model.mapToSource(index)
        rows.add(si.row())

    for row in rows:
        print(row)  
...