我在下面找到了我的问题的几个答案,但是我似乎无法弄清如何在我的情况下实现它们。
我想做的是将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
您必须调用invalidateFilter
方法才能应用过滤器。
invalidateFilter