Qt4 QSortFilterProxy模型和行号

Qt4 QSortFilterProxy模型和行号,qt4,pyqt4,Qt4,Pyqt4,由于排序和/或过滤的原因,我使用了一些带有相关模型的tableview,并用QSortFilterProxyModel进行了扩展。除了行号(我指的是垂直标题),其他一切都正常。 使用此代码: def headerData(self, section, orientation, role): if role == QtCore.Qt.DisplayRole: if orientation == QtCore.Qt.Horizontal: return

由于排序和/或过滤的原因,我使用了一些带有相关模型的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
固定的行号分配给每一行。这会导致排序/筛选时出现问题。 我想出了一个解决方案:覆盖默认的筛选和排序方法,在数据中添加一些额外的参数(行号),并在每次排序或筛选期间重写它


问题:还有其他解决办法吗?某些方法可以显示排序/筛选操作后的实际项目位置?

带有自定义
标题数据的
QSortFilterProxyModel
的一个简单子类可以:

class MyProxy(QtGui.QSortFilterProxyModel):
def headerData(自身、部门、方向、角色):
#如果显示垂直标题的角色
如果方向==QtCore.Qt.Vertical且角色==QtCore.Qt.DisplayRole:
#返回实际的行号
返回段+1
#对于其他情况,依赖于基本实现
return super(MyProxy,self).headerData(区段,方向,角色)

具有自定义
headerData
QSortFilterProxyModel
的一个简单子类将实现以下功能:

class MyProxy(QtGui.QSortFilterProxyModel):
def headerData(自身、部门、方向、角色):
#如果显示垂直标题的角色
如果方向==QtCore.Qt.Vertical且角色==QtCore.Qt.DisplayRole:
#返回实际的行号
返回段+1
#对于其他情况,依赖于基本实现
return super(MyProxy,self).headerData(区段,方向,角色)

您真的需要这些作为标题吗?如果您在模型中为“行数”添加另一列,这将更容易。是的,我更喜欢标题而不是单元格,因为它看起来更直观等待。。。我想我误解了
QSortFilterProxyModel
实际上保持了原始数字的完整性。但你不想这样?无论原始行位于何处,排序后都希望行号从
1
变为
N
,对吗?是的,完全正确-在代码段中,它是用旧索引(节参数)调用的,您真的需要这些索引作为标题吗?如果您在模型中为“行数”添加另一列,这将更容易。是的,我更喜欢标题而不是单元格,因为它看起来更直观等待。。。我想我误解了
QSortFilterProxyModel
实际上保持了原始数字的完整性。但你不想这样?排序后,无论原始行在哪里,您都希望行号从
1
变为
N
,对吗?是的,完全正确-在代码段中,它是用旧索引(节参数)调用的。不,不完全正确-我将重点放在垂直标题上,它与您的示例中的相同。@Miso:我将再次重复。这是
代理
型号。这应该代替
QSortFilterProxyModel
。我并不是针对你的实际模型提出这个建议。换句话说,实现我的目标的唯一方法是重新实现排序/筛选方法并设置新的索引变量,对吗?@Miso:不,我的答案是完全实现。你不需要任何额外的东西
MyProxy
只返回基于其排序顺序的行的垂直标题,而不是将其请求给实际模型(这是“固定”标题的原因)。抱歉,我发送上一条评论的速度太快了。是的,这就是我想要的!非常感谢你!不,不完全是这样-我关注的是垂直标题,这和我在你的例子中的一样。@Miso:我要重复一遍。这是
代理
型号。这应该代替
QSortFilterProxyModel
。我并不是针对你的实际模型提出这个建议。换句话说,实现我的目标的唯一方法是重新实现排序/筛选方法并设置新的索引变量,对吗?@Miso:不,我的答案是完全实现。你不需要任何额外的东西
MyProxy
只返回基于其排序顺序的行的垂直标题,而不是将其请求给实际模型(这是“固定”标题的原因)。抱歉,我发送上一条评论的速度太快了。是的,这就是我想要的!非常感谢你!