Hello,

i have some problems with my first attempt to use Model/View programming:

I tried to create a Model for a directory list. The folders are located on a 
mobile phone and I get the content over Obex and Bluetooth, so the 
communication can be really slow -> The model should be asynchronous.

When I get a reply from the phone (some items) I don't know how to get the 
parent QModelIndex for the directory (internal pointer). Currently I store the 
index in my internal class and update it on every createIndex call - is there 
any better solution?
But this doesn't even work, I can't append the child item (it isn't shown in 
the view). Can anybody look at my example and show me the right way?

Thanks,
Lukas
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class GeneralItem(object):
    def __init__(self,  name = str(),  parent = None,  index=None,  size = int(),  time = QDateTime(),  permission = str()):
        
        self.setName(name)
        self.setParent(parent)
        self.setModelIndex(index)
        self.setSize(size)
        self.setTime(time)
        self.setPermission(permission)
    
    def setName(self,  name):
        self.__name = name
    
    def setParent(self,  parent):
        self.__parent = parent
    
    def setModelIndex(self,  index):
        self.__index = index
    
    def setSize(self,  size):
        self.__size = size
    
    def setTime(self,  time):
        self.__time = time
    
    def setPermission(self,  permission):
        self.__permission = permission
    
    def name(self):
        return self.__name
    
    def parent(self):
        return self.__parent
    
    def modelIndex(self):
        return self.__index
    
    def row(self):
        if self.parent():
            return self.parent().children().index(self)
        return 0
    
    def size(self):
        return self.__size
    
    def time(self):
        return self.__time
    
    def permission(self):
        return self.__permission

class DirectoryItem(GeneralItem):
    def __init__(self,  name = str(),  parent = None,  size = int(),  time = QDateTime(),  permission = str()):
        GeneralItem.__init__(self,  name,  parent,  size,  time,  permission)
        
        self.clearChildren()

    def children(self):
        return self.__children
    
    def hasChildren(self):
        return bool(self.children())

    def appendChild(self,  child):
        child.setParent(self)
        self.__children.append(child)

    def clearChildren(self):
        self.__children = list()

    def __len__(self):
        return len(self.children())

def FileItem(GeneralItem):
    def hasChildren(self):
        return False

class ObexDirectoryView(QAbstractItemModel):
    def __init__(self):
        QAbstractItemModel.__init__(self)

        self.__rootItem = DirectoryItem()

    def rowCount(self,  parent=QModelIndex()):
        if parent.isValid():
            #print "rowCount, parent is valid -> internalPointer"
            parentItem = parent.internalPointer()
            #print "parentItem",  parentItem,  parentItem.name(),  parentItem.children(),  parentItem.children()[0].name()
        else:
            #print "rowCount, parent is NOT valid -> rootItem"
            parentItem = self.__rootItem
        #print "rowCount",  len(parentItem)
        return len(parentItem)

    def hasChildren(self,  index=QModelIndex()):
        parentItem = index.internalPointer()
        if parentItem is not None:
            #print "hasChildren",  parentItem,  parentItem.hasChildren()
            return parentItem.hasChildren()
        else:
            #print "hasChildren",  parentItem,  "True"
            return True

    def columnCount(self,  parent=QModelIndex()):
        #print "columnCount",  1
        return 1

    def index(self, row, column, parent=QModelIndex()):
        if not self.hasIndex(row, column, parent):
            #print "index -> not self.hasIndex"
            return QModelIndex()

        if parent.isValid():
            #print "index parent is valid -> interalPointer"
            parentItem = parent.internalPointer()
        else:
            #print "index parent is not valid -> rootItem"
            parentItem = self.__rootItem

        child = parentItem.children()[row]
        #print "index parent",  parentItem
        #print "index child", child
        #print "index",  row,  column,  child
        #print "index child name",  child.name()
        #print "index parent name",  parentItem.name()
        index = self.createIndex(row, column, child)
        print "create index",  index,  index.row(),  index.column(),  "for",  child.name()
        if index.column() == 0:
            child.setModelIndex(index)
        return index

    def parent(self, index):
        if not index.isValid():
            #print "parent -> not index.isvalid()"
            return QModelIndex()

        parent = index.internalPointer().parent()
        if parent == self.__rootItem or parent is None:
            #print "parent -> parent == self.__rootItem or parent is None"
            return QModelIndex()
        #print "parent",  parent.row(), 0, parent
        return self.createIndex(parent.row(), 0, parent)

    def data(self,  index,  role = Qt.DisplayRole):
        if index.isValid() and role == Qt.DisplayRole and index.column() == 0:
            item = index.internalPointer()
            #print "data",  index,  role,  item.name()
            return QVariant(item.name())
        #print "data -> else branch"
        return QVariant()

    def appendChild(self,  child,  parent=None):
        #print "appendChild, child"
        if parent == None:
            parent = self.__rootItem
        
        index = parent.modelIndex() or QModelIndex()
        print "append to",  index,  index.row(),  index.column(),  "for",  parent.name()
        self.insertRow(-1,  index)

        parent.appendChild(child)

class ColumnView(QTreeView):
    def __init__(self):
        super(ColumnView,  self).__init__()

        self.model = ObexDirectoryView()
        
        item1 = DirectoryItem("Root Item 1")
        item2 = DirectoryItem("Root Item 2")
        item3 = DirectoryItem("Child 1 of Root 1")
        item4 = DirectoryItem("Child 1 of Root 2")
        
        self.model.appendChild(item1)
        self.model.appendChild(item2)
        self.model.appendChild(item3,  item1)
        self.model.appendChild(item4,  item2)
        
        self.setModel(self.model)
        

        self.resize(700,  700)
        self.show()
        
        item5 = DirectoryItem("Root Item 3")
        item6 = DirectoryItem("Child 1 of Root 3")
        
        self.model.appendChild(item5)
        self.model.appendChild(item6,  item5)
        

app = QApplication([])
m = ColumnView()
app.exec_()
_______________________________________________
PyQt mailing list    [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to