Search code examples
pyqt5qtablewidgetqtablewidgetitem

PyQt5 - Make integers and dates in QTableWidget properly sortable


I put the data into my QTableWidget tableView using a loop:

    for i in range(0, len(res)):

        self.tableView.setItem(i, 2, QTableWidgetItem(str(create_dataframe(res)[2][i])))
        self.tableView.setItem(i, 3, QTableWidgetItem(str(create_dataframe(res)[3][i])))

where create_dataframe(res)[2][i] returns value of class 'int' and create_dataframe(res)[3][i] returns value of class 'datetime.datetime' (like '2017-03-25 16:51:24'). The question is: how do I make these items properly sortable through self.tableView.setSortingEnabled(True), i.e. not as strings, but as integers and datetime respectively? I know that I should use setData and Qt.DisplayRole, but could you please give an example using this short piece of code? Thank you.


Solution

  • OK, here is the answer I came up with by myself:

    self.tableView.setItem(i, 2, QTableWidgetItem(str(create_dataframe(res)[2][i])))
    it3 = QTableWidgetItem()
    it3.setData(Qt.EditRole, QVariant(create_dataframe(res)[3][i]))
    self.tableView.setItem(i, 3, it3)
    

    I.e. there is no need to transform datetime value: it can be properly sorted in string form. As for integer values, I have to create an instance of QTableWidgetItem(), then use .setData with QVariant on it. After this I can setItem to the table.