2012-10-01 2 views
2

행 : 1, 행 : 2 ... 행 : 100, 하지만 정렬이 예상대로 작동하지 않습니다 (수치 적으로).Python : QTableWidget의 숫자 정렬

for i in range(0, self.rows): 
    item = QtGui.QTableWidgetItem() 
    item.setData(Qt.DisplayRole, "Row: %s" %(i)) 
    item.setData(Qt.EditRole, i) 
    self.ui.tableWidget.setItem(i, 0, item) 

내가 얻을 : 1,2,3,4 ... 대신 행 : 1, 행 : 텍스트 정렬이 코드와 함께 잘 작동하지만 내가 기대되지 않는 2, 행 : 3 ... 편집 목적으로 EditRole을 사용하는 것이 좋겠지 만 (숫자 정렬의 경우), DisplayRole로 설정 되었기 때문에 텍스트가 표시 될 것으로 예상됩니다. 정렬을 위해 어떻게 든 쓰는 기능이 유일한 방법 일 수 있습니까? DisplayRole 및 EditRole 내가 예상 한 일을하지 않는 이유

답변

4

나는 여전히 관심이 있지만, 나는이 같은 문제를 해결했습니다

class MyTableWidgetItem(QtGui.QTableWidgetItem): 
    def __init__(self, text, sortKey): 
      QtGui.QTableWidgetItem.__init__(self, text, QtGui.QTableWidgetItem.UserType) 
      self.sortKey = sortKey 

    #Qt uses a simple < check for sorting items, override this to use the sortKey 
    def __lt__(self, other): 
      return self.sortKey < other.sortKey 

... 채우는 테이블 :

for i in range(0, self.rows): 
    item = MyTableWidgetItem("Row: %s" %(i), i) 
    self.ui.tableWidget.setItem(i, 1, item) 
7

QTableWidgetItem의 경우 Qt.DisplayRoleQt.EditRole은 동일하게 처리됩니다.

item.setData(Qt.DisplayRole, "Row: %s" %(i)) 
item.setData(Qt.EditRole, i) 

번째 줄은 단순히 제 회선에 설정된 데이터를 덮어 것이다

코드에 있다는 것을 의미한다. 따라서 datasetData 함수가 다시 구현되지 않는 한 별도의 EditRole이 없습니다.

정렬 동작을 변경하는 표준 방법은 QTableWidgetItem (기본값은 정렬을 위해 DisplayRole 데이터를 사용하도록 하드 코딩 됨)에 대한보다 작음 연산자를 다시 구현하는 것입니다.

class TableWidgetItem(QtGui.QTableWidgetItem): 
    def __lt__(self, other): 
     return (self.data(QtCore.Qt.UserRole).toLongLong() < 
       other.data(QtCore.Qt.UserRole).toLongLong()) 
:

다음 서브 클래스는 Qt는 일반적으로 숫자 정렬을 위해 무엇을 할 것이라고 재현