【问题标题】:Sorting a Qtablewidget ascending by IP addresses按 IP 地址升序对 Qtablewidget 进行排序
【发布时间】:2021-11-18 14:49:17
【问题描述】:

我在 PyQt 中有一个包含大量数据的 QTableWidget,我想按如下 IP 地址对其进行排序:

10.10.10.1
10.10.10.12
10.10.11.111
10.11.12.3

“小”ips先(1.1.1.1)再升

有什么想法吗?

这是我在很好的帮助后编写的代码。

                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)

进程以退出代码 -1073740791 (0xC0000409) 结束

ps:数据来自数据库;-) 所有的 IP 地址都在第 5 行。这是我要排序的地方。

【问题讨论】:

    标签: python pyqt5 qtablewidget


    【解决方案1】:

    你必须创建一个自定义的 QTableWidget 并重写 lessthan 方法来实现 IP 地址比较逻辑。

    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_())
    

    【讨论】:

    • 您好,我试过了,但我的代码不工作它停止并出现错误代码。
    • 我会用我的代码更新问题,也许你会发现我犯的错误。我用你的类作为 IPObject
    • @MilanBültmann 如果您需要帮助,请提供minimal reproducible example
    猜你喜欢
    • 2012-11-25
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2016-03-04
    • 1970-01-01
    • 2013-05-30
    • 2019-07-23
    相关资源
    最近更新 更多