Python internalPointer方法的工作原理

Python internalPointer方法的工作原理,python,qt,model,pyqt,Python,Qt,Model,Pyqt,在下面的代码中,Car()和Plane()继承自Base类 每次单击QTableView时OnClick()方法都会收到一个QModelIndex作为其传入参数 在OnClick()方法node=index.internalPointer()行的范围内,返回在模型的self.items变量中定义的汽车或飞机的实例 模型的self.items不是一个列表,而是一个子类层次变量。然而,internalPointer()方法确实使它看起来像是索引了一个列表变量,并将被单击的QModelIndex的行

在下面的代码中,
Car()
Plane()
继承自
Base

每次单击
QTableView
OnClick()
方法都会收到一个
QModelIndex
作为其传入参数

OnClick()
方法
node=index.internalPointer()
行的范围内,返回在模型的
self.items
变量中定义的汽车或飞机的实例

模型的
self.items
不是一个列表,而是一个子类层次变量。然而,
internalPointer()
方法确实使它看起来像是索引了一个列表变量,并将被单击的QModelIndex的行号作为参数提供给它

如果您能提供更多关于
internalPointer()
方法如何工作的详细信息,我将不胜感激,这样我就可以相应地设计Plane、Car和基类(这样它们返回我想要的,而不是
internalPointer()


我们并不清楚相应地设计类意味着什么,但内部指针只是在
QModelIndex
中借助
createIndex()
创建的

请参阅的文档


因此,由你来储存有用的东西。

老实说,我不知道你想从这里得到什么(你的问题措辞混乱),但是,您可能错误地将父/子关系与行/列合并,或者您的行数不正确。简而言之,您似乎有一个
plane0
car0
项,每个项都有两个子项。但视图中只显示了两行,每个行有3列,没有子项。
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_())