我有一个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没有到达我的模型,并且带有浮点数的列仍然像字符串一样排序。
为什么此解决方案不起作用?我错过了什么?

最佳答案

latest official documentation


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


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


  排序的另一种方法是禁用视图上的排序,并向用户施加特定顺序。这是通过在QSortFilterProxyModel上(或在原始模型上实现sort()时)显式调用带有所需列和顺序作为参数的sort()来完成的。例如:


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



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


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

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


请注意,您粘贴的两行没有分号。由于语法错误,该代码甚至无法像这样编译。最好粘贴正确的代码。

如果它不起作用,则只需执行排序即可。

09-11 17:55