QTableView сортировать данные столбца по UserRole - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть QStandardItemModel, переданная в QTableView.Один из столбцов в моей модели содержит даты, которые имеют удобные для пользователя displayData и удобные для пользователя userData.Так, например, один QStandardItem может отображать строку типа 22 Nov 2018, но данные пользователя будут выглядеть как 324586 (секунды с начала эпохи).Однако, когда я сортирую столбец, он, конечно, сортирует по displayData.Как я могу заставить таблицу сортировать по userData вместо этого?

1 Ответ

0 голосов
/ 27 ноября 2018

Вы должны использовать 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_())

enter image description here

Хотя я предпочитаю сохранять 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_())

enter image description here

...