实现 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
我在下面找到了我的问题的几个答案,但我似乎无法弄清楚如何在我的案例中实施它们。
我想做的是将 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