我有一个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没有到达我的模型,带浮点数的列仍然像字符串一样排序。 为什么这个解决方案不起作用?我错过了什么吗?
答案 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
将打开基础模型的排序。这可能是你需要的。