首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSortFilterProxyModel不应用SortRole

QSortFilterProxyModel不应用SortRole
EN

Stack Overflow用户
提问于 2014-01-03 15:23:45
回答 2查看 1.9K关注 0票数 1

我有一个带有子类QSqlQueryModel和QSortFilterProxyModel的QSortFilterProxyModel。基础数据库中的某些列包含浮点数,并将其排序为字符串。示例:

代码语言:javascript
复制
-0.06
-1.45
 0.02
 0.05
 ...

使用Python/PyQt,我从这个被接受的答案实现了概述的解决方案,但它不起作用。

我的子类QSqlQueryModel:

代码语言:javascript
复制
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

设置代理:

代码语言:javascript
复制
proxy = QSortFilterProxyModel(self)
proxy.setSortRole(CatalogModel.SortRole)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-04 05:18:21

来自最新正式文件

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

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

排序的另一种方法是禁用视图上的排序,并向用户强制执行特定的顺序。这是通过使用所需的列显式调用sort()来完成的,并将order作为QSortFilterProxyModel上的参数(如果它实现了sort(),则在原始模型上)。例如:

代码语言:javascript
复制
    proxyModel->sort(2, Qt::AscendingOrder);

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

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

代码语言:javascript
复制
proxy = QSortFilterProxyModel(self);
proxy.setSortRole(CatalogModel.SortRole);
proxy.sort(-1, Qt.AscendingOrder);

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

如果它不工作,只需实现您的排序。

票数 1
EN

Stack Overflow用户

发布于 2014-01-03 16:11:18

我想你应该把分类开关打开。类似于:

代码语言:javascript
复制
proxy.sort(-1, Qt.AscendingOrder);

根据docs,http://doc.qt.io/qt-4.8/qsortfilterproxymodel.html-1将打开底层模型的排序。这可能就是你所需要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20906945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档