1
在下面的代碼中Car()
和Plane()
繼承自Base
類。內部指針方法如何工作
每次QTableView
被點擊OnClick()
方法接收QModelIndex
作爲其傳入的參數。
OnClick()
範圍內方法node=index.internalPointer()
line返回模型的self.items
變量中定義的Car或Plane的實例。
型號的self.items
不是一個列表,而是一個子分類層次變量。然而internalPointer()
方法確實使它看起來像索引一個列表變量,其中提供給它作爲參數被點擊的QModelIndex的行號。
,如果你提供關於internalPointer()
方法是如何工作的,所以我可以據此設計飛機,汽車和基礎類的更多細節(讓他們返回我想要什麼,而不是什麼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列,沒有孩子。 – 2015-01-10 07:46:07