我使用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
只是一个整数,我不能用它做任何事情(?),而parent
是QModelIndex
,它是一个非持久引用,对吧?要回答的问题是“此索引是否指向源模型的invisibleRootItem()
?”。
我如何询问这种情况?
答案 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)