Hello, I am trying to create a simple model and view for a simple nested dictionary like d:
c1 = {'id':1, 'description':'child 1'} c2 = {'id':2, 'description':'child 2'} d = {'id':0, 'description':'whatever', 'children':[c1, c2]} I have a self-contained, relatively simple script attached. When I run it and try to open the top-level entry by clicking on the +, I get errors like: Traceback (most recent call last): File "tree_test.py", line 111, in parent parent = index.internalPointer().parent AttributeError: 'ItemDataRole' object has no attribute 'parent' Traceback (most recent call last): File "tree_test.py", line 111, in parent parent = index.internalPointer().parent AttributeError: parent Traceback (most recent call last): File "tree_test.py", line 111, in parent parent = index.internalPointer().parent AttributeError: 'exceptions.AttributeError' object has no attribute 'parent' Bus error sometimes I get a different error: Traceback (most recent call last): File "tree_test.py", line 111, in parent parent = index.internalPointer().parent AttributeError: 'ItemDataRole' object has no attribute 'parent' Segmentation fault Could anyone please help me understand what is happening? I dont understand why index.internalPointer() is returning an ItemDataRole object or an exceptions.AttributeError object. Im running Qt-4.5.0, sip-4.7.9 and PyQt-4.4.4. Thank you, Darren
""" """ from PyQt4 import QtCore, QtGui class TreeItem: def __init__(self, data, parent=None): self._parent = parent self._data = data @property def children(self): return [] @property def columns(self): return [self.data['id'], self.data['description']] @property def parent(self): return self._parent @property def data(self): return self._data @property def row(self): if self.parent: return self.parent.children.index(self) return 0 def __len__(self): return len(self.columns) class RootItem(TreeItem): def __init__(self): self._parent = None self._children = [] @property def children(self): return self._children @property def columns(self): return ['ID', 'Description'] def appendChild(self, child): self._children.append(child) class DictItem(TreeItem): @property def children(self): return [TreeItem(child, self) for child in self.data['children']] class FileModel(QtCore.QAbstractItemModel): """ """ def __init__(self, parent=None): super(FileModel, self).__init__(parent) self._rootItem = RootItem() @property def rootItem(self): return self._rootItem def columnCount(self, parent): if parent.isValid(): return len(parent.internalPointer().columns) else: return len(self.rootItem.columns) def data(self, index, role): if not index.isValid() or role != QtCore.Qt.DisplayRole: return QtCore.QVariant() item = index.internalPointer() return QtCore.QVariant(item.columns[index.column()]) def headerData(self, section, orientation, role): if orientation == QtCore.Qt.Horizontal and \ role == QtCore.Qt.DisplayRole: return QtCore.QVariant(self.rootItem.columns[section]) return QtCore.QVariant() def index(self, row, column, parent): if not self.hasIndex(row, column, parent): return QtCore.QModelIndex() if parent.isValid(): parentItem = parent.internalPointer() else: parentItem = self.rootItem child = parentItem.children[row] return self.createIndex(row, column, child) def parent(self, index): if not index.isValid(): return QtCore.QModelIndex() parent = index.internalPointer().parent if parent == self.rootItem or parent is None: return QtCore.QModelIndex() return self.createIndex(parent.row, 0, parent) def rowCount(self, parent): if parent.isValid(): parentItem = parent.internalPointer() else: parentItem = self.rootItem return len(parentItem.children) def appendDict(self, d): assert 'id' in d assert 'description' in d self.rootItem.appendChild(DictItem(d)) class FileView(QtGui.QTreeView): def __init__(self, model=None, parent=None): super(FileView, self).__init__(parent) self.setModel(model) if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) model = FileModel() form = FileView(model) c1 = {'id':1, 'description':'child 1'} c2 = {'id':2, 'description':'child 2'} d = {'id':0, 'description':'whatever', 'children':[c1, c2]} model.appendDict(d) form.show() sys.exit(app.exec_())
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt