Реализация filterAcceptsRows для фильтрации по внешнему ключу - PullRequest
2 голосов
/ 26 января 2020

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

Я пытаюсь подключить ComboBox к QTableView. где int id из выбранной строки ComboBox будет использоваться для фильтрации внешнего ключа модели, присоединенной к QTableView.

Допустим, у нас есть таблица personnel с внешним ключом person_company_fk колонка. Эта таблица отображается в QTableView через модель. Модель анализируется через фильтр с подклассами из QSortFilterProxyModel.

Я подключился

self.currentIndexChanged.connect(self.personnelFilteredModel.FilterData(company_id))

, так что любое изменение в выборе в ComboBox отправляет идентификатор отфильтрованной модели.

Моя проблема в том, что модель не обновляет sh, и, хотя все подключено, QTableView не изменяется (ошибок тоже нет). Я считаю, что моя проблема заключается в том, как я звоню dataChanged.emit(). Кстати, если я установлю self.fkFilter на значение в __init__, модель отобразит отфильтрованные строки.

Вы можете помочь?

class CustomFilterModel(QtCore.QSortFilterProxyModel):
    def __init__(self):
        super(CustomFilterModel,self).__init__()
        self.fkColumnIndex=None
        self.nameColumnIndex=None
        self.fkFilter=None
        self.setDynamicSortFilter(True)

    def FilterData(self,fk):
        self.fkFilter=fk
        x=self.rowCount()
        y=self.columnCount()
        self.dataChanged.emit(self.index(0,0),self.index(x,y))

    def filterAcceptsRow(self, source_row:int, source_parent:QtCore.QModelIndex) -> bool:
        if (self.fkFilter !=None) and (self.fkColumnIndex !=None):
            x=self.createIndex(source_row,self.fkColumnIndex)
            j=int(self.sourceModel().data(x))
            if j==self.fkFilter:
                return True
            else:
                return False
        else:
            return True

1 Ответ

1 голос
/ 26 января 2020

Вы должны вызвать метод invalidateFilter для применения фильтра.

def FilterData(self,fk):
    self.fkFilter = fk
    self.invalidateFilter()

С другой стороны, метод filterAcceptsRow может быть улучшен:

def filterAcceptsRow(self, source_row:int, source_parent:QtCore.QModelIndex) -> bool:
    if self.fkFilter and self.fkColumnIndex:
        ix = self.sourceModel().index(source_row, self.fkColumnIndex)
        text = ix.data()
        return text == self.fkFilter
    return True
...