7

QTreeWidget の列に数値が入力されていますが、どうすれば並べ替えることができますか?

setSortingEnabled(true); を使用する場合 文字列のみを正しく並べ替えることができるため、列は並べ替えられます。

1 10 100 2 20 200

しかし、これは私が欲しいものではありません!提案?

4

4 に答える 4

10

< 演算子をオーバーライドして並べ替え条件を変更すると、このように並べ替えることができます。

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

この例では、実際のケースを無視し、小文字モードのフィールドに直面しています。

于 2008-12-14T15:10:48.057 に答える
6

を使用した pyQt の実装を次に示します。__lt__

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()
于 2011-02-22T07:48:28.047 に答える
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)
于 2012-08-27T16:13:07.980 に答える
-1

数値は数値でソートされますが、文字列は逆にソートされます (つまり"19999" < "2")。

より具体的には、文字列は左から右に 1 文字ずつ比較され、いずれかの文字が異なると比較が停止します。たとえば、19and121は次のように比較されます。

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

それらを正しく並べ替えるには、それらを数値に変換してから並べ替える必要があります。それ以外は、数値を正しい方法で読み取る独自の並べ替えアルゴリズムを実装できます。

于 2008-12-12T16:22:11.583 に答える