当0行mapToSource时,QSortFitlerProxyMode查找源列

时间:2014-02-14 16:05:33

标签: qt pyqt qsortfilterproxymodel

我在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中访问的私有函数。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

  1. 如果您知道标题的名称以及命名是否唯一,那么您可以使用headerData()遍历proxy.sourceModel()的所有列,并与期望的名称进行比较。

  2. 如果您可以控制源模型的实现,那么您可以重新实现headerData()以返回Qt :: UserRole上的列号,然后调用proxy.headerData(proxy_col,Qt.UserRole).toInt( )将为您提供源模型列。

  3. 如果排序模型子类化,则可能有效(或可能不是)的另一个技巧:通过调用createIndex(0,col)创建“禁止”的非现有索引。

  4. 方式3:工作机会很低。我通常会做类似于方式2的事情。