[英]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
中只有一个整数,我无法对其进行任何操作(?),而parent
是QModelIndex
,这是一个非持久引用,对吗? 要回答的问题是“此索引是否指向源模型的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.