python - QTableView 按 UserRole 对列数据进行排序
问题描述
我有一个 QStandardItemModel 管道到 QTableView。我的模型中的一列包含具有用户友好的 displayData 和计算机友好的 userData 的日期。因此,例如一个 QStandardItem 可能会显示一个字符串,22 Nov 2018
但用户数据看起来像324586
(自纪元以来的秒数)。但是,当我对列进行排序时,它当然会按 displayData 排序。如何强制表格按 userData 排序?
解决方案
您必须使用setSortRole():
from PyQt5 import QtCore, QtGui, QtWidgets
import random
DATECOLUMN = 1
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self._tableView = QtWidgets.QTableView()
self.setCentralWidget(self._tableView)
self._model = QtGui.QStandardItemModel(10, 4)
self._tableView.setModel(self._model)
now_second = QtCore.QDateTime.currentDateTime().toSecsSinceEpoch()
for i in range(self._model.rowCount()):
for j in range(self._model.columnCount()):
if j == DATECOLUMN:
t = QtCore.QDateTime.fromSecsSinceEpoch(random.randint(0, now_second))
text = t.toString("dd MMM yyyy")
it = QtGui.QStandardItem(text)
it.setData(t.toSecsSinceEpoch(), QtCore.Qt.UserRole)
else:
it = QtGui.QStandardItem("{}-{}".format(i, j))
self._model.setItem(i, j, it)
self._model.setSortRole(QtCore.Qt.UserRole)
self._model.sort(DATECOLUMN, QtCore.Qt.AscendingOrder)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
虽然我更喜欢直接保存 QDateTime 并使用委托以您想要的格式显示数据。
from PyQt5 import QtCore, QtGui, QtWidgets
import random
DATECOLUMN = 1
class DateDelegate(QtWidgets.QStyledItemDelegate):
def displayText(self, value, locale):
return locale.toString(value, "dd MMM yyyy")
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self._tableView = QtWidgets.QTableView()
self.setCentralWidget(self._tableView)
self._model = QtGui.QStandardItemModel(10, 4)
self._tableView.setModel(self._model)
delegate = DateDelegate(self._tableView)
self._tableView.setItemDelegateForColumn(DATECOLUMN, delegate)
now_second = QtCore.QDateTime.currentDateTime().toSecsSinceEpoch()
for i in range(self._model.rowCount()):
for j in range(self._model.columnCount()):
if j == DATECOLUMN:
t = QtCore.QDateTime.fromSecsSinceEpoch(random.randint(0, now_second))
it = QtGui.QStandardItem()
it.setData(t, QtCore.Qt.DisplayRole)
else:
it = QtGui.QStandardItem("{}-{}".format(i, j))
self._model.setItem(i, j, it)
self._model.sort(DATECOLUMN, QtCore.Qt.AscendingOrder)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
推荐阅读
- node.js - 试图在 bigtable 中模拟单元级别 TTL,但整个列族数据被垃圾收集删除
- react-native - 在不使用 Expo 的情况下使用 android 模拟器模拟 react-native-maps 内运动的最佳方法?
- c# - 二维int数组自定义dependencyProperty绑定不起作用
- javascript - Reactjs:在同一域中加载 Iframe URl 在反应路由器中失败
- r - R Shiny - 使用 JQuery 跟踪选项卡集中的活动选项卡
- chart.js - 如何在chart.js的圆环图中添加多个图例
- regex - 正则表达式删除注释代码
- reactjs - React Native:如何声明和调用全局变量
- json - 如何使用fluentd解析带有json对象的日志
- c - 我在 C 中的动态海量有一些麻烦(只有 C,没有 C++)