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_())