<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Andreas Pakulat wrote:
<blockquote cite="mid20061006191927.GA968@morpheus.apaku.dnsalias.org"
 type="cite">
  <pre wrap="">On 06.10.06 10:14:17, Matt Chambers wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">Thanks, that works but then then any branches you have open in the tree view 
closed.   I guess there is no way to maintain
the open/close status of existing branches, and default new ones to open?
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Hmm, there's API to set the status of a given model index to expanded
(in QTreeView), you'd have to store the indexes that are expanded.

But I think there's no way to have new tree items opened by default,
other than calling setExpanded after inserting new items. 

But generally emitting modelReset() signal means the model's data
completely changed and thus the view drops all information it stores.

If you only want to insert a new node into the model, write functions
that call beginInsertRows/endInsertRows. For more information see the
Qt4 docs, there a chapter about model/view. 

Andreas
  </pre>
</blockquote>
Keeping a record of which nodes I have open ending up being slow, and
there were other problems with the full<br>
refresh option that turned me off to it.&nbsp; So I started to look into
doing a single full update in the beginning, and <br>
then pulling incremental updates which update my underlying data.<br>
<br>
Question now is, I can update the data no problem.&nbsp; How can I find out
what indexes to use when emiting a dataChanged signal<br>
if I update the underlying data in an elementtree ?<br>
<br>
<br>
class TreeModel( QtCore.QAbstractItemModel ):<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def __init__(self, show ):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QtCore.QAbstractItemModel.__init__(self)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.__columns = [ ]&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.__data = Data(show,self)<br>
&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def addColumn(self,label,tag):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """addColumn(String label, string Tag)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.__columns.append( [QtCore.QVariant(label),tag] )<br>
&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def data(self, index, role):<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if role != DISPLAY_ROLE:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EMPTY_VARIANT<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not index.isValid():<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EMPTY_VARIANT<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el = index.internalPointer()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return QtCore.QVariant(
el.get(self.__columns[index.column()][1]) )<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def headerData(self, section, orientation, role):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if orientation == QtCore.Qt.Horizontal and role == DISPLAY_ROLE:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.__columns[section][0]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EMPTY_VARIANT<br>
<br>
&nbsp;&nbsp;&nbsp; def index(self, row, column, parent):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if parent.isValid():<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item = parent.internalPointer()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item = self.__data.rootNode<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.createIndex(row, column, item[row])<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def parent(self, index):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not index.isValid():<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EMPTY_INDEX<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item,row = self.__data.parentMap[index.internalPointer()]<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if id(item) == id(self.__data.rootNode):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EMPTY_INDEX<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
self.createIndex(self.__data.parentMap[item][1],0,item)<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def rowCount(self, parent):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if parent.isValid():<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item = parent.internalPointer()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item = self.__data.rootNode<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return len(item)<br>
&nbsp;&nbsp;&nbsp; <br>
&nbsp;&nbsp;&nbsp; def columnCount(self, parent):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return len(self.__columns)<br>
<div class="moz-signature">
<div
 style="text-decoration: none; font-family: Arial,Tahoma,Verdana; font-size: 12px;"><br>
<br>
</div>
</div>
</body>
</html>