在外部码头上实施filterAcceptsRows过滤

问题描述 投票:0回答:1

我在下面找到了我的问题的几个答案,但是我似乎无法弄清如何在我的情况下实现它们。

我想做的是将ComboBox连接到QTableView,其中ComboBox所选行的int id将用于过滤附加到QTableView的模型的外键。

假设我们有personnel表,该表带有person_company_fk外键列。该表通过模型显示在QTableView中。该模型通过QSortFilterProxyModel的子类过滤器进行解析。

我已经连接了self.currentIndexChanged.connect(self.personnelFilteredModel.FilterData(company_id)),因此ComboBox中选择的任何更改都会将ID发送给过滤后的模型。

我的问题是模型不会刷新,即使所有内容都已连接,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
python pyside2 qsortfilterproxymodel
1个回答
0
投票

您必须调用invalidateFilter方法才能应用过滤器。

invalidateFilter
© www.soinside.com 2019 - 2024. All rights reserved.