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

【问题讨论】:

老实说,我几乎不知道你想在这里得到什么(你的问题措辞令人困惑),但看起来你可能错误地将父/子关系与行/列或你的行数混为一谈不正确。简而言之,您似乎有一个 plane0car0 项目,每个项目都有两个孩子。但是您的视图中只显示了 2 行,每行有 3 列,并且没有子节点。 【参考方案1】:

通过相应地设计你的类并不完全清楚你的意思,但内部指针只是你在QModelIndex 中的createIndex() 的帮助下创建的东西。

查看createIndex的文档。

因此,您可以在其中存储有用的东西。

【讨论】:

以上是关于internalPointer 方法的工作原理的主要内容,如果未能解决你的问题,请参考以下文章

数据表以及过滤方法的工作原理

关于JAVA BlockingQueue的工作原理

DisplayNameFor()方法的工作原理

JDBC的工作原理是啥?

servlet生命周期与工作原理

struts2.0的工作原理?