在下面的代码中,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_())

最佳答案

相应地设计类并不清楚您的意思,但是内部指针仅是您在createIndex()中借助QModelIndex创建的内容。

请参见createIndex的文档。

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

关于python - internalPointer方法如何工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27870213/

10-10 00:35