2015-01-09 61 views
1

在下面的代碼中Car()Plane()繼承自Base類。內部指針方法如何工作

enter image description here

每次QTableView被點擊OnClick()方法接收QModelIndex作爲其傳入的參數。

OnClick()範圍內方法node=index.internalPointer() line返回模型的self.items變量中定義的Car或Plane的實例。

型號的self.items不是一個列表,而是一個子分類層次變量。然而internalPointer()方法確實使它看起來像索引一個列表變量,其中提供給它作爲參數被點擊的QModelIndex的行號。

,如果你提供關於internalPointer()方法是如何工作的,所以我可以據此設計飛機,汽車和基礎類的更多細節(讓他們返回我想要什麼,而不是什麼internalPointer()

from PyQt4 import QtCore, QtGui 
app=QtGui.QApplication(sys.argv) 

class Base(object):  
    def __init__(self, name, parentNode=None):   
     self._name = name 
     self._children=[] 
     self._parentNode=parentNode 
     if parentNode is not None: 
      parentNode.addChild(self) 
    def typeInfo(self): 
     return "BaseNode" 
    def addChild(self, child): 
     self._children.append(child) 
    def name(self): 
     return self._name 
    def setName(self, name): 
     self._name = name 
    def child(self, row): 
     return self._children[row] 
    def childCount(self): 
     return len(self._children) 
    def getParent(self): 
     return self._parentNode 
    def row(self): 
     if self._parentNode is not None: 
      return self._parentNode._children.index(self) 

class Car(Base):  
    def __init__(self, name, parent=None): 
     super(Car, self).__init__(name, parent)   
    def typeInfo(self): 
     return "CarNode" 
class Plane(Base):  
    def __init__(self, name, parent=None): 
     super(Plane, self).__init__(name, parent)   
    def typeInfo(self): 
     return "PlaneNode" 

class DataModel(QtCore.QAbstractItemModel): 
    def __init__(self): 
     QtCore.QAbstractTableModel.__init__(self) 

     self.items = Base("Base") 
     car0 = Car("Car0", self.items) 
     car1 = Car("Car1", car0) 
     car2 = Car("Car2", car1) 

     plane0 = Plane("Plane0", self.items) 
     plane1 = Plane("Plane1", plane0) 
     plane2 = Plane("Plane2", plane1) 

    def columnCount(self, index=QtCore.QModelIndex()): 
     return 3 

    def getNodeFromIndex(self, index):  
     if index.isValid(): 
      node = index.internalPointer() 
      if node: 
       return node    
     return self.items 

    def parent(self, index): 
     node = self.getNodeFromIndex(index) 
     parentNode = node.getParent() 
     if parentNode == self.items: 
      return QtCore.QModelIndex() 
     return self.createIndex(parentNode.row(), 0, parentNode) 

    def index(self, row, column, parentIndex): 
     parentNode = self.getNodeFromIndex(parentIndex) 
     childItem = parentNode.child(row) 
     if childItem:    
      newIndex=self.createIndex(row, column, childItem) 
      return newIndex 
     else: 
      return QtCore.QModelIndex() 

    def rowCount(self, parent=QtCore.QModelIndex()): 
     if not parent.isValid(): 
      parentNode = self.items 
     else: 
      parentNode = parent.internalPointer() 
     return parentNode.childCount() 

    def data(self, index, role): 
     if not index.isValid(): return QtCore.QVariant() 
     row=index.row() 
     column=index.column() 
     node=index.internalPointer() 

     if role==QtCore.Qt.DisplayRole: 
      if column==0 and not self.columnCount(): 
       return QtCore.QModelIndex() 
      else: 
       return QtCore.QModelIndex() 

class Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 
     mainLayout=QtGui.QHBoxLayout() 
     self.setLayout(mainLayout) 

     self.dataModel=DataModel() 

     self.viewA=QtGui.QTableView() 
     self.viewA.setModel(self.dataModel) 
     self.viewA.clicked.connect(self.onClick) 

     mainLayout.addWidget(self.viewA) 
     self.show() 

    def onClick(self, index): 
     node=index.internalPointer() 
     print node.name(), node.getParent().name() 

window=Window() 
sys.exit(app.exec_()) 
+2

我真的不知道你在這裏試圖得到什麼(你的問題是令人困惑的),但是看起來你可能會錯誤地將父/子關係與行/列混淆在一起,或者你的行數不正確。總之,你似乎有一個'plane0'和'car0'項目,每個項目有兩個孩子。但是你的視圖中只顯示了2行,每行都有3列,沒有孩子。 – 2015-01-10 07:46:07

回答

1

這不正是我將不勝感激清除您通過相應地設計你的類的意思,但內部指針IST只是你用的createIndex()幫助QModelIndex創建。

createIndex的文檔。

因此,您需要存儲一些有用的東西。