是否可以在QTreeWidget列中对数字进行排序?

时间:2008-12-12 16:10:36

标签: linux qt sorting qtreewidget qtreewidgetitem

我有一个QTreeWidget,其中一列填充了一些数字,我该如何对它们进行排序?

如果我使用setSortingEnabled(true);我只能正确排序字符串,因此我的列已排序:

1    10    100    2    20    200

但这不是我想要的东西! 建议?

4 个答案:

答案 0 :(得分:8)

您可以排序覆盖<操作员和改变这样的排序控制。

class TreeWidgetItem : public QTreeWidgetItem {
  public:
  TreeWidgetItem(QTreeWidget* parent):QTreeWidgetItem(parent){}
  private:
  bool operator<(const QTreeWidgetItem &other)const {
     int column = treeWidget()->sortColumn();
     return text(column).toLower() < other.text(column).toLower();
  }
};

在这个例子中,它忽略了真实的情况,面对小写模式的字段。

答案 1 :(得分:4)

这是使用__lt__

的pyQt实现
class TreeWidgetItem(QtGui.QTreeWidgetItem):

    def __init__(self, parent=None):
        QtGui.QTreeWidgetItem.__init__(self, parent)

    def __lt__(self, otherItem):
        column = self.treeWidget().sortColumn()
        return self.text(column).toLower() < otherItem.text(column).toLower()

答案 2 :(得分:3)

我发现的最好方法是使用try块来查找数字

class TreeWidgetItem( QtGui.QTreeWidgetItem ):
    def __init__(self, parent=None):
        QtGui.QTreeWidgetItem.__init__(self, parent)

    def __lt__(self, otherItem):
        column = self.treeWidget().sortColumn()
        try:
            return float( self.text(column) ) > float( otherItem.text(column) )
        except ValueError:
            return self.text(column) > otherItem.text(column)

答案 3 :(得分:0)

数字按数值排序,但字符串排序相反(即"19999" < "2")。

更具体地说,字符串从左到右逐个字符地进行比较,直到一个或另一个字符不同,此时比较停止。例如,19121将按如下方式进行比较:

"19"[0] != "121"[0] ? // no
"19"[1] != "121"[1] ? // yes
     '9' > '2' ?      // yes
          return some value that indicates "19" greater than "121";

要正确排序,您需要将它们转换为数值,然后对它们进行排序。除此之外,您可以实现自己的排序算法,以正确的方式读取数字。