internalPointer 方法的工作原理
Posted
技术标签:
【中文标题】internalPointer 方法的工作原理【英文标题】:How internalPointer method works 【发布时间】:2015-01-09 22:22:09 【问题描述】:在Car()
和Plane()
下面的代码中都继承自Base
类。
每次点击QTableView
时,OnClick()
方法都会收到一个QModelIndex
作为其传入参数。
在OnClick()
方法的范围内node=index.internalPointer()
行返回模型的self.items
变量中定义的Car 或Plane 的实例。
模型的self.items
不是一个列表,而是一个子分类的层次变量。然而internalPointer()
方法确实使它看起来它索引一个列表变量,并将其作为参数提供给它被单击的 QModelIndex 的行号。
如果您能提供更多关于 internalPointer()
方法如何工作的详细信息,我将不胜感激,这样我就可以相应地设计 Plane、Car 和 Base 类(这样它们会返回我想要的,而不是 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_())
【问题讨论】:
老实说,我几乎不知道你想在这里得到什么(你的问题措辞令人困惑),但看起来你可能错误地将父/子关系与行/列或你的行数混为一谈不正确。简而言之,您似乎有一个plane0
和 car0
项目,每个项目都有两个孩子。但是您的视图中只显示了 2 行,每行有 3 列,并且没有子节点。
【参考方案1】:
通过相应地设计你的类并不完全清楚你的意思,但内部指针只是你在QModelIndex
中的createIndex()
的帮助下创建的东西。
查看createIndex的文档。
因此,您可以在其中存储有用的东西。
【讨论】:
以上是关于internalPointer 方法的工作原理的主要内容,如果未能解决你的问题,请参考以下文章