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

问题描述 投票:0回答:5

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

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

1 10 100 2 20 200

但这不是我想要的! 有建议吗?

linux qt sorting qtreewidget qtreewidgetitem
5个回答
12
投票

您可以排序覆盖 < operator and changing sort condiction like this.

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();
  }
};

在此示例中,它忽略实际情况,以小写模式面对字段。


6
投票

这是一个使用

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

4
投票

我发现的最好方法是使用 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)

0
投票

您还可以将显示的文本插入为整数:

for ( int i = 0; i < 1000; ++i )
{
   auto pTreeWidgetItem{ new QTreeWidgetItem( pTreeWidget ) };
   pTreeWidgetItem->setData( 0, Qt::DisplayRole, i + 1 );
}

在这种情况下,该项目将识别该整数并对其进行正确排序。显示的文本仍然是数字本身。


-1
投票

数字按数值排序,但字符串以相反的方式排序(即

"19999" < "2"
)。

更具体地说,从左到右逐个字符地比较字符串,直到一个或其他字符不同,此时停止比较。例如,

19
121
将这样比较:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.