实现 filterAcceptsRows 以过滤外键

Implementing filterAcceptsRows for filtering on a foreign key

我在下面找到了我的问题的几个答案,但我似乎无法弄清楚如何在我的案例中实施它们。

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

假设我们有一个 personnel table 和一个 person_company_fk 外键列。这个table是通过一个模型显示在一个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

您必须调用 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