2010-02-25 2 views
5

QTreeView에 표시 될 QAbstractItemModel의 하위 클래스를 생성 중입니다.파이썬 객체를 PyQt4의 QVariant에서 다시 얻으려면 어떻게해야합니까?

index()parent() 함수 QAbstractItemModelcreateIndex 유전 함수를 사용하고 께 row, columndata 필요 QModelIndex 제공을 생성한다. 여기서 테스트 목적으로 데이터는 파이썬 문자열입니다. 나는 다시 내 데이터를 얻을 필요가 index(), parent()data() 기능 내에서

class TestModel(QAbstractItemModel): 
    def __init__(self): 
     QAbstractItemModel.__init__(self) 

    def index(self, row, column, parent): 
     if parent.isValid(): 
      return self.createIndex(row, column, "bar") 
     return self.createIndex(row, column, "foo") 

    def parent(self, index): 
     if index.isValid(): 
      if index.data().data() == "bar":       <--- NEVER TRUE 
       return self.createIndex(0, 0, "foo") 
     return QModelIndex() 

    def rowCount(self, index): 
     if index.isValid(): 
      if index.data().data() == "bar":       <--- NEVER TRUE 
       return 0 
     return 1 

    def columnCount(self, index): 
     return 1 

    def data(self, index, role): 
     if index.isValid(): 
      return index.data().data()        <--- CANNOT DO ANYTHING WITH IT 
     return "<None>" 

. QVariant으로 제공됩니다. QVariant에서 파이썬 객체를 다시 얻으려면 어떻게해야합니까?

답변

4

중요한 것은 전혀 QVariant 처리하지, 직접 QModelIndexinternalPointer()를 사용하는 것입니다 (다만 완성도,하지만 ... 거기에보고 많은이 없다).

class TestModel(QAbstractItemModel): 
    def __init__(self, plan): 
     QAbstractItemModel.__init__(self) 

    def index(self, row, column, parent): 
     if not parent.isValid(): 
      return self.createIndex(row, column, "foo") 
     return self.createIndex(row, column, "bar") 

    def parent(self, index): 
     if index.internalPointer() == "bar": 
      return self.createIndex(0, 0, "foo") 
     return QModelIndex() 

    def rowCount(self, index): 
     if index.internalPointer() == "bar": 
      return 0 
     return 1 

    def columnCount(self, index): 
     return 1 

    def data(self, index, role): 
     if role == 0: # Qt.DisplayRole 
      return index.internalPointer() 
     else: 
      return None 
관련 문제