仅按QSortFilterProxyModel中的顶级项目过滤

时间:2018-07-19 10:18:44

标签: python pyqt pyqt5 qtreeview qsortfilterproxymodel

我使用QTreeView(PyQt 5)显示可用字体,效果很好。另外,我有一个QLineEdit可以使用QSortFilterProxyModel.setFilterRegExp()设置过滤器表达式,似乎也可以很好地工作。

问题是我希望过滤器仅应用于顶级条目。我的树显示如下:

> Helvetica LT Std
  > Helvetica LT Std
      Italic
      Bold
      Regular
  > Helvetica LT Std Black
      Regular
      Italic

等这意味着当我输入“ Helv”作为正则表达式时,所有其他字体都被正确隐藏,但样式行也被正确隐藏,因为它们中没有字体名称。

据我了解,我应该继承QSortFilterProxyModel并重写filterAcceptsRow()方法。这样,如果行是顶层条目,我将调用super()进行常规过滤,否则返回True以避免过滤子元素。

我的问题是如何确定该行是否具有除模型的invisibleRootItem()以外的其他父项。也许这很容易,但是我仍然对体系结构感到困惑。

我具有覆盖功能的接口:

def filterAcceptsRow(self, row, parent):

因为row只是一个整数,我不能用它做任何事情(?),而parentQModelIndex,它是一个非持久引用,对吧?要回答的问题是“此索引是否指向源模型的invisibleRootItem()?”。

我如何询问这种情况?

1 个答案:

答案 0 :(得分:0)

由于@vahancho的评论中的hint,我可以自己回答这个问题。

parent参数已经“知道”答案。在PyQt中,如果父级是不可见的根,则parent不会为“ null”(或None)。它仍然是QModelIndex对象,但其isValid()方法将返回False

所以我的子类如下:

class FontFilterProxyModel(QSortFilterProxyModel):
    """Custom proxy model that ignores child elements in filtering"""

    def filterAcceptsRow(self, row, parent):
        if parent.isValid():
            # Do not apply the filter to child elements
            return True
        else:
            return super(FontFilterProxyModel, self).filterAcceptsRow(row, parent)