[PyKDE] [PyQt]: how to refresh a QTreeView widget?

Oscar Cossu zerozerosette at gmail.com
Fri Sep 8 15:29:32 BST 2006


class DomItem:
    def __init__(self, node, row, parent=None):
        self.domNode = node
        # Record the item's location within its parent.
        self.rowNumber = row
        self.parentItem = parent
        self.childItems = {}

    def node(self):
        return self.domNode

    def parent(self):
        return self.parentItem

    def child(self, i):
        if self.childItems.has_key(i):
            return self.childItems[i]

        if i >= 0 and i < self.domNode.childNodes().count():
            childNode = self.domNode.childNodes().item(i)
            childItem = DomItem(childNode, i, self)
            self.childItems[i] = childItem
            return childItem

        return 0

    def row(self):
        return self.rowNumber




class DomModel(QtCore.QAbstractItemModel):
    def __init__(self, document, parent = None):
        QtCore.QAbstractItemModel.__init__(self, parent)

        self.domDocument = document

        self.rootItem = DomItem(self.domDocument, 0)

        self.idList=[]
        self.gotoList=[]
        self.errorList=[]

    def columnCount(self, parent):
        return 3

    def data(self, index, role):
        if not index.isValid():
            return QtCore.QVariant()

        if role != QtCore.Qt.DisplayRole:
            return QtCore.QVariant()

        item = index.internalPointer()

        node = item.node()
        attributes = QtCore.QStringList()
        attributeMap = node.attributes()

        if index.column() == 0:
            return QtCore.QVariant(node.nodeName())

        elif index.column() == 1:
            for i in range(0, attributeMap.count()):
                attribute = attributeMap.item(i)
                attributes.append(attribute.nodeName() + "=\"" + \
                                  attribute.nodeValue() + "\"")

            return QtCore.QVariant(attributes.join(" "))
        elif index.column() == 2:
            return QtCore.QVariant(node.nodeValue().split("\n").join(" "))
        else:
            return QtCore.QVariant()

    def flags(self, index):
        if not index.isValid():
            return QtCore.Qt.ItemIsEnabled

        return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable

    def headerData(self, section, orientation, role):
        if orientation == QtCore.Qt.Horizontal and role ==
QtCore.Qt.DisplayRole:
            if section == 0:
                return QtCore.QVariant(self.tr("Name"))
            elif section == 1:
                return QtCore.QVariant(self.tr("Attributes"))
            elif section == 2:
                return QtCore.QVariant(self.tr("Value"))
            else:
                return QtCore.QVariant()

        return QtCore.QVariant()

    def index(self, row, column, parent):
        if not parent.isValid():
            parentItem = self.rootItem
        else:
            parentItem = parent.internalPointer()

        childItem = parentItem.child(row)
        if childItem:
            return self.createIndex(row, column, childItem)
        else:
            return QtCore.QModelIndex()

    def parent(self, child):
        if not child.isValid():
            return QtCore.QModelIndex()

        childItem = child.internalPointer()
        parentItem = childItem.parent()

        if not parentItem or parentItem == self.rootItem:
            return QtCore.QModelIndex()

        return self.createIndex(parentItem.row(), 0, parentItem)

    def rowCount(self, parent):
        if not parent.isValid():
            parentItem = self.rootItem
        else:
            parentItem = parent.internalPointer()

        return parentItem.node().childNodes().count()


    def findNodeByTagNameID(self,tagName,id):
        element = self.domDocument.elementsByTagName(tagName)
        for e in  range(element.length()) :
            tmp=element.item(e).attributes().namedItem("id").nodeValue()
            if  tmp==id:
                return element.item(e)

        return None

    def removeRows(self,arow,count,parent):
          print "removeRow"
          self.beginRemoveRows(parent,arow,arow+count-1)
          for ii in range(count):
              nodoIndex=self.index(arow+ii,0,parent)
              NomeNodo= nodoIndex.data().toString()
              IdNodo=self.index(arow+ii,1,parent).data().toString()

              if IdNodo.contains("id"):
                  i=IdNodo.indexOf("id")
                  i=IdNodo.indexOf("\"",i)
                  f=IdNodo.indexOf("\"",i+1)
                  IdNodo=IdNodo.mid(i+1,f-i-1)
              else:
                  return False

              nodo=self.findNodeByTagNameID(NomeNodo,IdNodo)
              nodo.parentNode().removeChild(nodo)

          self.endRemoveRows()
          return True

    def validateDom(self,nodo):

        if nodo.isText():
            return

        if nodo.nodeName()=="text":
            return

        ##IDLIST
        if nodo.hasAttributes()==True and
nodo.attributes().contains("id")==True
:
            if nodo.attributes().namedItem("goToSequence"):
                goto=nodo.attributes().namedItem("goToSequence").nodeValue()
            else:
                goto="none"

            tmp=MyListElem(nodo.nodeName(),nodo.attributes().namedItem("id").nodeValue(),goto
)
            self.idList.append(tmp)
        ##----------------------------------------------

        ##GOTOLIST
        if nodo.hasAttributes()==True and
nodo.attributes().contains("goToSequence")==True
:
            tmp=MyListElem(nodo.nodeName(),nodo.attributes
().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue())
            if  tmp.goto!="none":
                self.gotoList.append(tmp)
        ##----------------------------------------------


        ##ERRORLIST
##        if nodo.hasAttributes()==True and
nodo.attributes().contains("question")==True
:
##            if  nodo.attributes().namedItem("question").nodeValue()==False
and nodo.lastChildElement("answer") != None:
##                self.errorList.append(MyListElem(nodo.nodeName(),
nodo.attributes().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue()))
        if nodo.nodeName()=="dialog":
            if  nodo.attributes().contains("actor")==False or
nodo.attributes().contains("id")==False :
                    self.errorList.append(MyListElem(nodo.nodeName(),
nodo.attributes().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue()))

        if nodo.nodeName()=="sentence":
            if nodo.parentNode().nodeName()!= "dialog":
                self.errorList.append(MyListElem(nodo.nodeName(),
nodo.attributes().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue()))
            elif  nodo.attributes().contains("goToSequence")==False or
nodo.attributes().contains("lifetime")==False or
nodo.attributes().contains("id")==False
or nodo.attributes().contains("question")==False:
                    self.errorList.append(MyListElem(nodo.nodeName(),
nodo.attributes().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue()))
            elif  nodo.attributes().namedItem("question").nodeValue()==False
and nodo.lastChildElement("answer") != None:
                self.errorList.append(MyListElem(nodo.nodeName(),
nodo.attributes().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue()))


        if nodo.nodeName()=="answer":
            if nodo.parentNode().nodeName()!= "sentence":
                self.errorList.append(MyListElem(nodo.nodeName(),
nodo.attributes().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue()))
            elif  nodo.attributes().contains("goToSequence")==False or
nodo.attributes().contains("execute")==False or
nodo.attributes().contains("id")==False
:
                self.errorList.append(MyListElem(nodo.nodeName(),
nodo.attributes().namedItem("id").nodeValue(),nodo.attributes
().namedItem("goToSequence").nodeValue()))

        ##----------------------------------------------

        if nodo.hasChildNodes():
            for count in range(nodo.childNodes().length()):
                self.validateDom(nodo.childNodes().at(count))









HERE IS WHERE CALL    MODEL::REMOVEROWS()

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
    .
    .
    .
    .


def cancellaNodo(self):
print self.view.model().removeRows(self.view.selectedIndexes()[0].row(),1,
self.view.selectedIndexes()[0].parent())
print self.view.model().domDocument.toString()






2006/9/8, Andreas Pakulat <apaku at gmx.de>:
>
> On 08.09.06 15:23:50, Oscar Cossu wrote:
> >    def removeRows(self,arow,count,parent):
> >
> >          self.beginRemoveRows(parent,arow,arow+count-1)
> >
> >                for ii in range(count):
> >                     ##code for removing a row from QDomDocument here
> >
> >          self.endRemoveRows()
> >          return True
> >
> > This is my model class. When i remove a row the qtreeview repaint the
> tree
> > but the row deleted isn't the one i've selected.
> > example:
> >
> > document
> >     element1
> >     element2
> >     element3
> >
> > pick  elements2 for removing.
> > treeview update after removing but show:
> >
> > document
> >    element1
> >    element2
> >
> > Now, if i do:
> > print  qtreeview.model().domDocument.toString()
> > the result is:
> >
> > document
> >     element1
> >     element3
>
> Your removeRows looks ok. I guess you're either telling the treeview (by
> false row number) that it should remove the last row, or your data
> method doesn't fetch the proper row from the document.
>
> As you use QDomDocument, your complete model is probably not that large,
> can you post a complete example, or at least the complete model
> including QDomItem.
>
> Andreas
>
> --
> You'll feel devilish tonight.  Toss dynamite caps under a flamenco
> dancer's
> heel.
>
> _______________________________________________
> PyKDE mailing list    PyKDE at mats.imk.fraunhofer.de
> http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20060908/8d57e4a7/attachment.html


More information about the PyQt mailing list