【问题标题】:Filter only by top-level items in QSortFilterProxyModel仅按 QSortFilterProxyModel 中的顶级项过滤
【发布时间】:2018-12-27 10:35:13
【问题描述】:

我使用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()?”。

我该如何询问这种情况?

【问题讨论】:

  • 提示:如果parent 为空 - 它指的是顶级项目,否则它指向父项目。
  • 好的,它并不完全准确,但让我走上了正轨(见我的回答)

标签: python pyqt pyqt5 qtreeview qsortfilterproxymodel


【解决方案1】:

感谢@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2015-11-17
    相关资源
    最近更新 更多