实施filterAcceptsRows过滤外键

问题描述 投票:1回答: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个回答
1
投票

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

invalidateFilter

另一方面,filterAcceptsRow方法可以改进:

def FilterData(self,fk):
    self.fkFilter = fk
    self.invalidateFilter()
© www.soinside.com 2019 - 2024. All rights reserved.