实现筛选外键的filterAcceptsRows

2024-09-30 04:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在下面的问题中找到了几个答案,但我似乎不知道如何在我的案例中实现它们

我试图做的是将组合框连接到QTableView,其中组合框的选定行的int id将用于过滤附加到QTableView的模型的外键

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

我已经接通了

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

因此,组合框中选择的任何更改都会将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

Tags: 模型selfnoneidtruesourcereturninit
1条回答
网友
1楼 · 发布于 2024-09-30 04:33:22

必须调用^{}方法才能应用筛选器

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

相关问题 更多 >

    热门问题