python - 内部指针方法的工作原理

标签 python qt model pyqt

Car() 下面的代码中和Plane()继承自Base类。

enter image description here

每次QTableView点击OnClick()方法接收 QModelIndex作为其传入参数。

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

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

最佳答案

尚不清楚相应地设计类的含义,但内部指针只是您在 QModelIndex 中的 createIndex() 的帮助下创建的东西。

请参阅 createIndex 的文档.

因此,您可以在其中存储有用的内容。

关于python - 内部指针方法的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27870213/

相关文章:

python - QSortFilterProxyModel.mapToSource 崩溃。没有信息为什么

python - Django JSONField 不保存 0 值

joomla - 当存在关键字 "use"时,Joomla 模型中的 PHPMailer 错误 500

python - 如何存储执行函数的结果并在以后重新使用?

python - 在 python 文件中运行 Django 项目时出错

python - 如何对子图/嵌套图进行拓扑排序?

c++ - Qt 创建者:c++:未定义对 Class::Function 的引用

javascript - 在 Python 中使用大整数模拟 JavaScript 加法错误

c++ - Qt/C++ 中的 ComboBox 默认值

c# - 将一个模型转换为另一个模型的通用方法