Sorting a Qtablewidget ascending by IP addresses

Viewed 68

I have a QTableWidget in PyQt with a lot of data and I want to sort it by the IP address like this:

10.10.10.1
10.10.10.12
10.10.11.111
10.11.12.3

"Small" ips first (1.1.1.1) and then ascending

Any ideas how its possible?

This is the code i made after the nice help.

                for row in results:
                    self.tableWidget.setItem(tablerow, 0, QTableWidgetItem(str(row[0])))
                    self.tableWidget.setItem(tablerow, 1, QTableWidgetItem(row[1]))
                    self.tableWidget.setItem(tablerow, 2, QTableWidgetItem(row[2]))
                    self.tableWidget.setItem(tablerow, 3, QTableWidgetItem(row[3]))
                    self.tableWidget.setItem(tablerow, 4, QTableWidgetItem(row[4]))
                    self.tableWidget.setItem(tablerow, 5, IpAddressTtem(str(row[5])))
                    self.tableWidget.setItem(tablerow, 6, QTableWidgetItem(row[6]))
                    self.tableWidget.setItem(tablerow, 7, QTableWidgetItem(row[7]))
                    ###
                    self.tableWidget.setItem(tablerow, 8, QTableWidgetItem(decryption(to_enc=row[8])))
                    ###
                    self.tableWidget.setItem(tablerow, 9, QTableWidgetItem(row[9]))
                    self.tableWidget.setItem(tablerow, 10, QTableWidgetItem(row[10]))
                    self.tableWidget.setItem(tablerow, 11, QTableWidgetItem(row[11]))

                    self.tableWidget.setSortingEnabled(True)

                    tablerow += 1
                self.tableWidget.sortItems(5, QtCore.Qt.SortOrder.AscendingOrder)

Process finished with exit code -1073740791 (0xC0000409)

ps: the data comes from a database ;-) and all the Ip Adresses are in row 5. This is where i want to sort.

1 Answers

You have to create a custom QTableWidget and override the lessthan method to implement the IP address comparison logic.

import socket
import sys

from PyQt5 import QtCore, QtWidgets


class IpAddressTtem(QtWidgets.QTableWidgetItem):
    def __lt__(self, other):
        if isinstance(other, IpAddressTtem):
            return socket.inet_aton(self.text()) < socket.inet_aton(other.text())
        return super().__lt__(other)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    w = QtWidgets.QTableWidget(4, 2)
    w.resize(640, 480)
    w.show()

    w.setItem(0, 0, QtWidgets.QTableWidgetItem("item1"))
    w.setItem(0, 1, IpAddressTtem("10.10.10.1"))
    w.setItem(1, 0, QtWidgets.QTableWidgetItem("item2"))
    w.setItem(1, 1, IpAddressTtem("10.10.10.12"))
    w.setItem(2, 0, QtWidgets.QTableWidgetItem("item3"))
    w.setItem(2, 1, IpAddressTtem("10.10.11.111"))
    w.setItem(3, 0, QtWidgets.QTableWidgetItem("item4"))
    w.setItem(3, 1, IpAddressTtem("10.11.12.3"))

    w.setSortingEnabled(True)
    w.sortItems(0, QtCore.Qt.SortOrder.AscendingOrder)

    sys.exit(app.exec_())
Related