QTableView 排序日期和值

Posted

技术标签:

【中文标题】QTableView 排序日期和值【英文标题】:QTableView Sorting dates and values 【发布时间】:2014-05-04 21:44:55 【问题描述】:

我有一个包含一些常规文本、一些数字和日期的表格,文本排序很好,但数字和日期不是,这是因为给定的值是字符串,而不是 int 或 QDate 对象,我必须实现什么才能获得实际的 int 和实际的 QDate 项才能正确排序?

是在 ItemModel 中还是在 TableView 中?我必须继承它吗?

【问题讨论】:

您可以为此使用QSortFilterProxyModel。或者您可以尝试将类型更改为 int 和 QDate,它可能会自行正确排序。 我明白了,在你提供的链接中说我可以“在你的模型中实现 PySide.QtGui.QSortFilterProxyModel.sort(),或者使用 PySide.QtGui.QSortFilterProxyModel 来包装你的模型”如何我做第一个? 我认为这行不通。对于自定义排序,您必须为代理实现 lessThan 函数。我没有看到文档中提到的作为模型的虚拟方法。 【参考方案1】:

感谢 M4rtini,我可以实现正确的功能。对于任何与之斗争的人。这是代码。

self.tableView = QtGui.TableView(self)
self.table_model = QtGui.QStandardItemModel(0, 0)
self.proxyModel = CustomSortingModel(self)

self.proxyModel.setSourceModel(self.table_model)
self.tableView.setModel(self.proxyModel)

class CustomSortingModel(QtGui.QSortFilterProxyModel):
    def lessThan(self,left,right):

        col = left.column()

        dataleft = left.data()
        dataright = right.data()

        if col == 2:
            dataleft = float(dataleft)
            dataright = float(dataright)
        elif col == 3:
            dataleft = QtCore.QDate.fromString(dataleft, "d/M/yy").addYears(100)
            dataright = QtCore.QDate.fromString(dataright, "d/M/yy").addYears(100)

        return dataleft < dataright

【讨论】:

以上是关于QTableView 排序日期和值的主要内容,如果未能解决你的问题,请参考以下文章

QTableView排序信号?

QTableView“ResizeToContents”列太宽,启用排序

QTableView的自定义排序方法?

模型排序时更新 QTableView/QHeaderView 中的排序指示符

Qt窗口及控件-QTreeview/QTableView排序问题

排序QTableView时如何保留选择