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

Reply via email to