【问题标题】:QTableView sort column data by UserRoleQTableView 按 UserRole 对列数据进行排序
【发布时间】:2019-04-28 17:20:42
【问题描述】:

我有一个 QStandardItemModel 管道到 QTableView。我的模型中的一列包含具有用户友好的 displayData 和计算机友好的 userData 的日期。因此,例如,一个 QStandardItem 可能会显示像 22 Nov 2018 这样的字符串,但用户数据看起来像 324586(自纪元以来的秒数)。但是,当我对列进行排序时,它当然会按 displayData 排序。如何强制表格按 userData 排序?

【问题讨论】:

    标签: python pyqt pyqt5 qtableview


    【解决方案1】:

    你必须使用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_())
    

    【讨论】:

    • 啊,所以我需要在模型上设置它,而不是视图!仍然习惯于模型/视图框架中的所有内容...感谢您提供非常完整的答案!
    • @Spencer 我建议您阅读:doc.qt.io/qt-5/model-view-programming.html,这样您就可以了解 Qt 中的 MVC。另一方面,我建议对于未来的问题,如果您指出某些事情失败了,请提供minimal reproducible example
    猜你喜欢
    • 2012-07-21
    • 2010-11-20
    • 2015-04-23
    • 2011-11-12
    • 2022-11-12
    相关资源
    最近更新 更多