2010-02-25 30 views
5

Tôi đang tạo một lớp con của QAbstractItemModel để được hiển thị trong một QTreeView.Làm cách nào để lấy lại đối tượng python của tôi từ một QVariant trong PyQt4?

My index()parent() chức năng tạo ra QModelIndex sử dụng chức năng QAbstractItemModel thừa hưởng createIndex và cung cấp cho nó row, column, và data cần thiết. Ở đây, cho mục đích thử nghiệm, dữ liệu là một chuỗi Python.

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>" 

Trong index(), parent(), và data() chức năng tôi cần để có được dữ liệu của tôi trở lại. Nó đến như là một QVariant. Làm cách nào để lấy lại đối tượng Python của tôi từ QVariant?

Trả lời

4

Điều quan trọng là sử dụng internalPointer() trực tiếp trên QModelIndex, không phải đối phó với QVariant ở tất cả.

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 
Các vấn đề liên quan