문제

숫자로 채워진 열이있는 QtreeWidget이 있는데 어떻게 정렬 할 수 있습니까?

setSortingEnabled (true)를 사용하는 경우; 문자열 만 올바르게 정렬 할 수 있으므로 열이 정렬됩니다.

1 10 100 2 20 200

그러나 이것은 내가 원하는 것이 아닙니다! 제안?

도움이 되었습니까?

해결책

<연산자를 재정의하고 이와 같이 정렬 된 정렬을 변경할 수 있습니다.

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

이 예에서는 소문자 모드에서 필드를 직면하는 실제 사례를 무시합니다.

다른 팁

다음은 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()

내가 찾은 가장 좋은 방법은 시도 블록을 사용하여 숫자를 찾는 것입니다.

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)

숫자는 숫자 값별로 정렬되지만 문자열은 반대 방식을 분류합니다 (즉 "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";

올바르게 정렬하려면 숫자 값으로 변환 한 다음 정렬해야합니다. 그 외에는 숫자를 올바른 방법으로 읽는 고유 한 정렬 알고리즘을 구현할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top