繁体   English   中英

仅按QSortFilterProxyModel中的顶级项目过滤

[英]Filter only by top-level items in QSortFilterProxyModel

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

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

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

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

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

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

我具有覆盖功能的接口:

def filterAcceptsRow(self, row, parent):

在该row中只有一个整数,我无法对其进行任何操作(?),而parentQModelIndex ,这是一个非持久引用,对吗? 要回答的问题是“此索引是否指向源模型的invisibleRootItem() ?”。

我如何询问这种情况?

感谢@vahancho评论中的提示 ,我可以自己回答这个问题。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM