我在pyqt 4.8中对QSortFilterProxyModel进行子类化。
我正在尝试将代理标头列映射到源列,并且一直在使用我创建的方法。
def mapProxyColtoSourceCol(proxy, col):
#Get the first Valid Row on the Proxy and create and index on that column
#Then map the index to the source and return the source column
col = proxy.mapToSource(proxy.index(0,col)).column()
return col
这很简单,工作正常。但是当行过滤器删除了所有代理的行时,我遇到了问题。在这种情况下,在(0,col)创建的代理索引无效,无法映射到源,返回的源列为-1。即使删除了所有行,我仍然希望能够将头列从代理映射到源并获取源头信息。看看C源代码,似乎映射使用了一些我不知道如何在pyQt中访问的私有函数。有没有办法做到这一点?
答案 0 :(得分:1)
如果您知道标题的名称以及命名是否唯一,那么您可以使用headerData()遍历proxy.sourceModel()的所有列,并与期望的名称进行比较。
如果您可以控制源模型的实现,那么您可以重新实现headerData()以返回Qt :: UserRole上的列号,然后调用proxy.headerData(proxy_col,Qt.UserRole).toInt( )将为您提供源模型列。
如果排序模型子类化,则可能有效(或可能不是)的另一个技巧:通过调用createIndex(0,col)创建“禁止”的非现有索引。