Moh*_*med 4 qt pyqt qtableview python-3.x qsortfilterproxymodel
我正在使用自定义QSortFilterProxyModel来QTableView通过覆盖来实现自定义过滤filterAcceptsRow().如何在更改过滤条件时通知我的应用程序,并将filterAcceptsRow()其应用于整个表格后?
基本上,我希望在应用过滤后获得可见项目的列表,目前我通过我在模型中实现的自定义函数计算此列表,该函数迭代行并获得可见行列表.这是低效的,因为如果在它们之间没有发生过滤动作,则对该函数的两次调用将产生相同的结果.
所有型号都应该发射layoutAboutToBeChanged()和layoutChanged(),之前和之后,他们进行排序,过滤,或可能影响视图任何其他方式改变.
根据我的观察(在Qt 4.8中),在layout*()对代理模型进行排序时会触发信号,但是如果实现过滤则不会.此外,文档明确指出这些信号所指的项目顺序,过滤自然不会改变顺序,只会影响行.
在这种情况下,只有rows*(...)信号(插入,移除等)才会触发,具体取决于滤波器的功能.不利的一面是,如果过滤器是递归应用的(通常是这样的),这些信号将以质量为单位发射,因此与单个结果动作相关联是没有用的.
要克服这个问题,你可以在设置过滤器后调用invalidate()(不是invalidateFilter btw,因为它也不会触发布局信号).
因为这会重新应用过滤和排序(后者在过滤时不需要,但无法避免),layout*()信号将在两者结束后触发.
但是最好自己处理过滤字符串/ regExp /,而不是使用基本方法(比如setFilterFixedString(...))来设置它们,至少避免过滤两次 - 如果你已经重新实现了,那么无论如何都没有多少开销filterAcceptsRow(...).
另一种方法是在设置排序或过滤时发出自己的信号,并通过使用Qt::QueuedConnection来确保在过滤结束后执行它来连接它.这就是我最终做的(更新表的注册表),并且我可以告诉它的工作方式与预期的一样.