QSortFilterProxyModel不应用SortRole

时间:2014-01-03 15:23:46

标签: python qt sorting model

我有一个QTableView,其中包含一个子类QSqlQueryModel和一个QSortFilterProxyModel。底层数据库中的某些列包含浮点数,它们按字符串排序。例如:

-0.06
-1.45
 0.02
 0.05
 ...

使用Python / PyQt,我实现了this accepted answer中概述的解决方案,但它不起作用。

我的子类QSqlQueryModel:

class CatalogModel(QSqlQueryModel):

  SortRole = Qt.UserRole + 1

  def data(self, index, role=Qt.DisplayRole):
    col = index.column()
    data = super(CatalogModel, self).data(index, role)

    print role == self.SortRole     # always False

    if role == self.SortRole:
      if col in (2,3,4):
        return data.toFloat()[0]

    return data

设置代理:

proxy = QSortFilterProxyModel(self)
proxy.setSortRole(CatalogModel.SortRole)

我自己的SortRole没有到达我的模型,带浮点数的列仍然像字符串一样排序。 为什么这个解决方案不起作用?我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

来自latest official documentation

  

在场景后面,视图调用模型上的sort()虚函数来重新排序模型中的数据。要使数据可排序,可以在模型中实现sort(),或者使用QSortFilterProxyModel来包装模型 - QSortFilterProxyModel提供了一个在sortRole()上运行的泛型sort()重新实现(默认情况下为Qt :: DisplayRole)这些项目和理解几种数据类型,包括int,QString和QDateTime。对于分层模型,递归应用于所有子项。字符串比较默认区分大小写;这可以通过设置sortCaseSensitivity属性来更改。

实现自己的sort()也可以是一个选项,但是:

  

排序的另一种方法是禁用视图上的排序并向用户强加某个顺序。这是通过在QSortFilterProxyModel上显式调用带有所需列和order作为参数的sort()来实现的(如果它实现了sort(),则在原始模型上)。例如:

    proxyModel->sort(2, Qt::AscendingOrder);
  

QSortFilterProxyModel可以按列-1排序,在这种情况下,它返回基础源模型的排序顺序。

您可以通过以下方式将-1传递给该方法:

proxy = QSortFilterProxyModel(self);
proxy.setSortRole(CatalogModel.SortRole);
proxy.sort(-1, Qt.AscendingOrder);

请注意,您在那里粘贴了两行而没有使用分号。由于语法错误,代码甚至不会像那样编译。最好粘贴正确的代码。

如果它不起作用,只需实施排序。

答案 1 :(得分:0)

我认为你需要切换排序。类似的东西:

proxy.sort(-1, Qt.AscendingOrder);

根据文档http://doc.qt.io/qt-4.8/qsortfilterproxymodel.html,列-1将打开基础模型的排序。这可能是你需要的。