【问题标题】:QSortFitlerProxyMode find source Column when 0 rows mapToSource whenQSortFitlerProxyMode find source Column when 0 rows mapToSource when
【发布时间】:2014-02-15 01:28:42
【问题描述】:

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

【问题讨论】:

  • 您可以改用mapFromSource,遍历所有源模型列并将结果与​​col进行比较。
  • 我尝试在 (0, sourceCol) 上创建源索引,迭代所有列。但是当调用 mapFromSource 时,proxyIndex 它仍然无效,因为所有代理行都被删除了。它为代理索引上的行和列都给出了 -1

标签: qt pyqt qsortfilterproxymodel


【解决方案1】:
  1. 如果您知道标头的命名方式以及该命名是否唯一,则可以使用 headerData() 遍历 proxy.sourceModel() 的所有列并与预期名称进行比较。

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

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

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

【讨论】:

  • 非常感谢。我刚开始编写 option1 作为一种可能性,因为大多数情况下命名是唯一的,但对它不满意,因为不能保证它会是唯一的。我尝试了选项 3 并在将索引映射到 Source 时遇到了段错误。我已经实现了 option2 并且效果很好。这正是我一直在寻找的。谢谢!
猜你喜欢
  • 2022-11-30
  • 2013-03-08
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2022-12-27
  • 1970-01-01
相关资源
最近更新 更多