I have a reimplemented QSortFilterProxyModel acceptRows to achieve custom behavior, i want it to not filter out items which have a valid child.
class KSortFilterProxyModel(QSortFilterProxyModel):
#FIXME: Funciona pero es endemoniadamente lento
def __init__(self, parent=None):
super(KSortFilterProxyModel, self).__init__(parent)
self.__showAllChildren = False
def showAllChildren(self):
return self.__showAllChildren;
def setShowAllChildren(self, showAllChildren):
if showAllChildren == self.__showAllChildren:
return
self.__showAllChildren = showAllChildren
self.invalidateFilter()
def filterAcceptsRow (self, source_row, source_parent ):
if self.filterRegExp() == "" :
return True #Shortcut for common case
if super(KSortFilterProxyModel, self).filterAcceptsRow( source_row, source_parent) :
return True
#one of our children might be accepted, so accept this row if one of our children are accepted.
source_index = self.sourceModel().index(source_row, 0, source_parent)
for i in range( self.sourceModel().rowCount(source_index)):
if self.filterAcceptsRow(i, source_index):
return True
return False
However this aproach doesn't seems to be efficient because with 300 items it takes almost 3 seconds to update the view, i want to know if theres a better way of doing it.
PD: This class is basically a translation of a KSysGuard one i found in KDE websvn