2013-02-27 113 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