2013-02-27 66 views
0

由于排序和/或过滤,我使用了一些与使用QSortFilterProxyModel扩展的相关模型的tableview。一切工作正常,除了行号(我的意思是垂直头)。 使用该代码:QSortFilterProxyModel和行号

def headerData(self, section, orientation, role): 
    if role == QtCore.Qt.DisplayRole: 
     if orientation == QtCore.Qt.Horizontal: 
      return self.__header[section] 
     elif orientation == QtCore.Qt.Vertical: 
      return section + 1 

固定行号分配给每一行。这在排序/过滤时会导致问题。 我想出了一个解决方案:覆盖默认过滤和排序方法,并将一些额外的参数(行号)添加到数据中,并在每次排序或过滤期间重写它。

问题:有没有其他解决方案呢?在排序/过滤操作之后显示实际项目位置的一些方法?

+0

你真的需要那些为标题?如果您在模型中为“行号”添加了另一列,这将更容易。 – Avaris 2013-02-27 12:37:38

+0

是的,我更喜欢标题而不是单元格,因为它看起来更直观 – Miso 2013-02-27 12:52:01

+0

等等......我想我误解了。 'QSortFilterProxyModel'实际上保持原始数字不变。但你不想那样?无论原始行在哪里,您都希望排序后的行号从“1”到“N”,对吗? – Avaris 2013-02-27 13:03:05

回答

3

QSortFilterProxyModel定制headerData一个简单的子类,将做到这一点:

class MyProxy(QtGui.QSortFilterProxyModel): 
    def headerData(self, section, orientation, role): 
     # if display role of vertical headers 
     if orientation == QtCore.Qt.Vertical and role == QtCore.Qt.DisplayRole: 
      # return the actual row number 
      return section + 1 
     # for other cases, rely on the base implementation 
     return super(MyProxy, self).headerData(section, orientation, role) 
+0

不,不完全 - 我将重点放在垂直头上,这与您的示例中的垂直头相同。 – Miso 2013-02-27 13:42:02

+0

@Miso:你意识到,这是'代理'模型,对吧? – Avaris 2013-02-27 13:43:52

+0

这是完整的示例代码:http://pastebin.com/TFzkYyJT – Miso 2013-02-27 13:44:18

相关问题