有点晚了,但它可能对其他人有用(也许一些真正的专家可能会增加精度/更正)!
QSortFilterProxyModel实例使用该方法
bool QSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex & source_parent)
确定是否应该保留给定的行。默认情况下,它只会测试返回的字符串
myProxyModel.data(source_row, QtCore.Qt.DisplayRole)
匹配您之前可能使用的正则表达式
myProxyModel.setFilterRegExp(myRegex)
由于您正在继承此QSortFilterProxyModel,因此您可以轻松定义一种新方法来过滤您的项目。
添加一个方法来设置你要检查的ID
myProxyModel.setFilterID(myRefId)
然后覆盖filterAcceptsRow以针对 ID 而不是正则表达式进行测试!
您可能还希望保持这两种方法(或更多)可用。为此,请在您的filterAcceptsRow 方法中从
myProxyModel.data(source_row, QtCore.Qt.UserRole)
而不是DisplayRole。设置UserRole时,您可以存储任何数据,而不仅仅是字符串。这是一个示例(在 python 中,它更短,但在任何语言中都一样),我们将自定义代理对象存储到模型中:
from PyQt4 import QtGui
from PyQt4 import QtCore
class MyDummyObj(object):
def __init__(self, objLabel, objID, hidden=False)
self.__label = objLabel
self.__id = objLabel
self.__hidden = hidden
def getLabel(self):
return self.__label
def getID(self):
return self.__id
def isSecret(self):
return self.__hidden
class MyProxyModel(QtGui.QSortFilterProxyModel):
def __init__(self):
super(MyProxyModel, self).__init__()
self.__testID = None
self.__showHidden = False
def setFilterID(self, filterID):
self.__testID = filterID
def showHiddenRows(self, showHidden=False)
self.__showHidden = showHidden
def filterAcceptsRow(self, sourceRow, sourceParent):
model = self.sourceModel()
myObject = model.data(model.index(sourceRow, 0, sourceParent),
QtCore.Qt.UserRole).toPyObject()
if not self.__showHidden:
if myObject.isSecret():
return False
if self.__testID is not None:
return self.__testID == myObject.getID()
return self.getFilterRegExp().exactMatch(myObject.getLabel())