我有一个带有子类QSqlQueryModel和QSortFilterProxyModel的QSortFilterProxyModel。基础数据库中的某些列包含浮点数,并将其排序为字符串。示例:
-0.06
-1.45
0.02
0.05
...使用Python/PyQt,我从这个被接受的答案实现了概述的解决方案,但它不起作用。
我的子类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没有到达我的模型,带有浮点数的列仍然像字符串一样排序。为什么这个解决方案不起作用?我错过了什么吗?
发布于 2014-01-04 05:18:21
来自最新正式文件
在场景后面,视图调用模型上的sort()虚拟函数来重新排序模型中的数据。为了使数据可排序,您可以在模型中实现sort(),也可以使用QSortFilterProxyModel包装模型- QSortFilterProxyModel提供了一个通用的sort()重新实现,该实现在条目的sortRole() (Qt::DisplayRole默认情况下)上操作,它可以理解多个数据类型,包括int、QString和QDateTime。对于分层模型,排序是递归地应用于所有子项。默认情况下,字符串比较是区分大小写的;可以通过设置sortCaseSensitivity属性来更改这一点。
实现您自己的排序()也可以是一种选择,但是:
排序的另一种方法是禁用视图上的排序,并向用户强制执行特定的顺序。这是通过使用所需的列显式调用sort()来完成的,并将order作为QSortFilterProxyModel上的参数(如果它实现了sort(),则在原始模型上)。例如:
proxyModel->sort(2, Qt::AscendingOrder);QSortFilterProxyModel可以按列-1排序,在这种情况下,它返回到底层源模型的排序顺序。
您可以以下列方式将-1传递给该方法:
proxy = QSortFilterProxyModel(self);
proxy.setSortRole(CatalogModel.SortRole);
proxy.sort(-1, Qt.AscendingOrder);请注意,您粘贴了这两行没有分号。由于语法错误,代码甚至不会那样编译。最好粘贴正确的代码。
如果它不工作,只需实现您的排序。
发布于 2014-01-03 16:11:18
我想你应该把分类开关打开。类似于:
proxy.sort(-1, Qt.AscendingOrder);根据docs,http://doc.qt.io/qt-4.8/qsortfilterproxymodel.html列-1将打开底层模型的排序。这可能就是你所需要的。
https://stackoverflow.com/questions/20906945
复制相似问题