<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:'times new roman', 'new york', times, serif;font-size:12pt"><div>Hi! &nbsp;I've been trying to fight my way though the model-view-delegate paradigm in pyqt and must admit that I'm a bit confused. &nbsp;Tables weren't that bad, but now I've reached trees....So, I have some questions. &nbsp;My first question is what are the reasons to use internalptr as compared to internalid. &nbsp;</div><div><br></div><div>One strategy that &nbsp;I've seen people adopt is to subclass&nbsp;QAbstractItemModel and to create a dictionary in it. &nbsp;They then use id() on the python side to create a dictionary where the keys are the ids of objects. As far as I can tell, internalid() also returns an address, so in data methods, etc. they can get at the actual item that they want to. &nbsp; When they use createindex, they store the id() of the object of interest for later
 retrieval, but it seems to hardly matter, because they use internalid() to get the address and then their dictionary to retrieve the object. &nbsp;Here is an example I found using this approach:</div><div><br></div><div><div>"""***************************************************************************</div><div>**</div><div>** Copyright (C) 2005-2005 Trolltech AS. All rights reserved.</div><div>**</div><div>** This file is part of the example classes of the Qt Toolkit.</div><div>**</div><div>** This file may be used under the terms of the GNU General Public</div><div>** License version 2.0 as published by the Free Software Foundation</div><div>** and appearing in the file LICENSE.GPL included in the packaging of</div><div>** this file. &nbsp;Please review the following information to ensure GNU</div><div>** General Public Licensing requirements will be met:</div><div><span>** <a target="_blank"
 href="http://www.trolltech.com/products/qt/opensource.html">http://www.trolltech.com/products/qt/opensource.html</a></span></div><div>**</div><div>** If you are unsure which license is appropriate for your use, please</div><div>** review the following information:</div><div><span>** <a target="_blank" href="http://www.trolltech.com/products/qt/licensing.html">http://www.trolltech.com/products/qt/licensing.html</a> or contact the</span></div><div>** sales department at sa...@trolltech.com.</div><div>**</div><div>** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE</div><div>** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.</div><div>**</div><div>***************************************************************************"""</div><div><br></div><div>import sys</div><div>from PyQt4 import QtCore, QtGui</div><div>from PyQt4.examples.itemviews.simpletreemodel import
 simpletreemodel_rc</div><div><br></div><div><br></div><div>class TreeItem(object):</div><div>&nbsp;&nbsp; &nbsp;def __init__(self, data, parent=None):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.parentItem = parent</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.itemData = data</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.childItems = []</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def appendChild(self, item):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.childItems.append(item)</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def child(self, row):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return self.childItems[row]</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def childCount(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return len(self.childItems)</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def columnCount(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return len(self.itemData)</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def data(self,
 column):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return self.itemData[column]</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def parent(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return self.parentItem</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def row(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if self.parentItem:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return self.parentItem.childItems.index(self)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 0</div><div><br></div><div><br></div><div>class TreeModel(QtCore.QAbstractItemModel):</div><div>&nbsp;&nbsp; &nbsp;def __init__(self, data, parent=None):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;QtCore.QAbstractItemModel.__init__(self, parent)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.idMap = {}</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rootData = []</div><div>&nbsp;&nbsp; &nbsp; &nbsp;
 &nbsp;rootData.append(QtCore.QVariant("Title"))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;rootData.append(QtCore.QVariant("Summary"))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.rootItem = TreeItem(rootData)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.idMap[id(self.rootItem)] = self.rootItem</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;self.setupModelData(data.split("\n"), self.rootItem)</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def columnCount(self, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if parent.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return self.idMap[parent.internalId()].columnCount()</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return self.rootItem.columnCount()</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def data(self, index, role):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not index.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp; &nbsp;return QtCore.QVariant()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if role != QtCore.Qt.DisplayRole:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QVariant()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;item = self.idMap[index.internalId()]</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QVariant(item.data(index.column()))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;except KeyError:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QVariant()</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def flags(self, index):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not index.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.Qt.ItemIsEnabled</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return QtCore.Qt.ItemIsEnabled |
 QtCore.Qt.ItemIsSelectable</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def headerData(self, section, orientation, role):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return self.rootItem.data(section)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QVariant()</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def index(self, row, column, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if row &lt; 0 or column &lt; 0 or row &gt;= self.rowCount(parent) or column &gt;= self.columnCount(parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QModelIndex()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not parent.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parentItem = self.rootItem</div><div>&nbsp;&nbsp; &nbsp; &nbsp;
 &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parentItem = self.idMap[parent.internalId()]</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;childItem = parentItem.child(row)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if childItem:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;index = self.createIndex(row, column, id(childItem))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.idMap.setdefault(index.internalId(), childItem)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return index</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QModelIndex()</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def parent(self, index):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if not index.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QModelIndex()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;
 &nbsp;try:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;childItem = self.idMap[index.internalId()]</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parentItem = childItem.parent()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if parentItem == self.rootItem:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QModelIndex()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return self.createIndex(parentItem.row(), 0, id(parentItem))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;except KeyError:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return QtCore.QModelIndex()</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def rowCount(self, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if parent.column() &gt; 0:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 0</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;
 &nbsp;try:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not parent.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parentItem = self.rootItem</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parentItem = self.idMap[parent.internalId()]</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return parentItem.childCount()</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;except:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 0</div><div><br></div><div>&nbsp;&nbsp; &nbsp;def setupModelData(self, lines, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parents = []</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;indentations = []</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parents.append(parent)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;indentations.append(0)</div><div><br></div><div>&nbsp;&nbsp;
 &nbsp; &nbsp; &nbsp;number = 0</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while number &lt; len(lines):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position = 0</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while position &lt; len(lines[number]):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if lines[number][position] != " ":</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;position += 1</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lineData = lines[number][position:].trimmed()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if not lineData.isEmpty():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Read the column data from the rest of the line.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp;columnStrings = lineData.split("\t", QtCore.QString.SkipEmptyParts)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;columnData = []</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for column in range(0, len(columnStrings)):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;columnData.append(columnStrings[column])</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if position &gt; indentations[-1]:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# The last child of the current parent is now the new parent</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# unless the current parent has no children.</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if parents[-1].childCount() &gt; 0:</div><div>&nbsp;&nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parents.append(parents[-1].child(parents[-1].childCount() - 1))</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;indentations.append(position)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while position &lt; indentations[-1] and len(parents) &gt; 0:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parents.pop()</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;indentations.pop()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Append a new item to the current parent's list of children.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;item =
 TreeItem(columnData, parents[-1])</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;self.idMap[id(item)] = item</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parents[-1].appendChild(item)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;number += 1</div><div><br></div><div><br></div><div>if __name__ == "__main__":</div><div>&nbsp;&nbsp; &nbsp;app = QtGui.QApplication(sys.argv)</div><div><br></div><div>&nbsp;&nbsp; &nbsp;f = QtCore.QFile(":/default.txt")</div><div>&nbsp;&nbsp; &nbsp;f.open(QtCore.QIODevice.ReadOnly)</div><div>&nbsp;&nbsp; &nbsp;model = TreeModel(QtCore.QString(f.readAll()))</div><div>&nbsp;&nbsp; &nbsp;f.close()</div><div><br></div><div>&nbsp;&nbsp; &nbsp;view = QtGui.QTreeView()</div><div>&nbsp;&nbsp; &nbsp;view.setModel(model)</div><div>&nbsp;&nbsp; &nbsp;view.setWindowTitle("Simple Tree Model")</div><div>&nbsp;&nbsp; &nbsp;view.show()</div><div>&nbsp;&nbsp;
 &nbsp;sys.exit(app.exec_())</div></div><div><br></div><div>#######################################################################</div><div>#######################################################################</div><div><br></div><div><br></div><div><br></div><div><br></div><div>The other strategy I've seen is for people to simply use internalptr() to retrieve the item that they want. Here is an example I found of this approach:</div><div><br></div><div><div>import sys</div><div>from PyQt4.QtCore import *</div><div>from PyQt4.QtGui import *</div><div>from copy import deepcopy</div><div>from cPickle import dumps, load, loads</div><div>from cStringIO import StringIO</div><div><br></div><div><br></div><div>class PyMimeData(QMimeData):</div><div>&nbsp;&nbsp; """ The PyMimeData wraps a Python instance as MIME data.</div><div>&nbsp;&nbsp; """</div><div>&nbsp;&nbsp; # The MIME type for instances.</div><div>&nbsp;&nbsp; MIME_TYPE =
 QString('application/x-ets-qt4-instance')</div><div><br></div><div>&nbsp;&nbsp; def __init__(self, data=None):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;""" Initialise the instance.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;"""</div><div>&nbsp;&nbsp; &nbsp; &nbsp;QMimeData.__init__(self)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;# Keep a local reference to be returned if possible.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self._local_instance = data</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;if data is not None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; # We may not be able to pickle the data.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; try:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;pdata = dumps(data)</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; except:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; # This format (as opposed to using a single sequence)allows
 the</div><div>&nbsp;&nbsp; # type to be extracted without unpickling the data itself.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.setData(self.MIME_TYPE, dumps(data.__class__) + pdata)</div><div><br></div><div>&nbsp;&nbsp; @classmethod</div><div>&nbsp;&nbsp; def coerce(cls, md):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;""" Coerce a QMimeData instance to a PyMimeData instance if</div><div>&nbsp;&nbsp; &nbsp; &nbsp;possible.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;"""</div><div>&nbsp;&nbsp; # See if the data is already of the right type. &nbsp;If it is thenwe know</div><div>&nbsp;&nbsp; # we are in the same process.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if isinstance(md, cls):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return md</div><div>&nbsp;&nbsp; # See if the data type is supported.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if not md.hasFormat(cls.MIME_TYPE):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return
 None</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;nmd = cls()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;nmd.setData(cls.MIME_TYPE, md.data())</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;return nmd</div><div><br></div><div>&nbsp;&nbsp; def instance(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;""" Return the instance.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;"""</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if self._local_instance is not None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return self._local_instance</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;io = StringIO(str(self.data(self.MIME_TYPE)))</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;try:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; # Skip the type.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; load(io)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; # Recreate the instance.</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return load(io)</div><div>&nbsp;&nbsp; &nbsp;
 &nbsp;except:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; pass</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;return None</div><div><br></div><div>&nbsp;&nbsp; def instanceType(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;""" Return the type of the instance.</div><div>&nbsp;&nbsp; &nbsp; &nbsp;"""</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if self._local_instance is not None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return self._local_instance.__class__</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;try:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return loads(str(self.data(self.MIME_TYPE)))</div><div>&nbsp;&nbsp; &nbsp; &nbsp;except:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; pass</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;return None</div><div><br></div><div><br></div><div>class myNode(object):</div><div>&nbsp;&nbsp; def __init__(self, name, state, description, parent=None):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.name =
 QString(name)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.state = QString(state)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.description = QString(description)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.parent = parent</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.children = []</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.setParent(parent)</div><div>&nbsp;&nbsp; def setParent(self, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if parent != None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; self.parent = parent</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; self.parent.appendChild(self)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; self.parent = None</div><div>&nbsp;&nbsp; def appendChild(self, child):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.children.append(child)</div><div>&nbsp;&nbsp; def childAtRow(self, row):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return self.children[row]</div><div>&nbsp;&nbsp; def rowOfChild(self, child): &nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp;for i, item in enumerate(self.children):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if item == child:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return i</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return -1</div><div>&nbsp;&nbsp; def removeChild(self, row):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;value = self.children[row]</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.children.remove(value)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return True</div><div>&nbsp;&nbsp; def __len__(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return len(self.children)</div><div><br></div><div>class myModel(QAbstractItemModel):</div><div>&nbsp;&nbsp; def __init__(self, parent=None):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;super(myModel, self).__init__(parent)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.treeView = parent</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.headers =
 ['Item','State','Description']</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.columns = 3</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Create items</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.root = myNode('root', 'on', 'this is root', None)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;itemA = myNode('itemA', 'on', 'this is item A',self.root)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;#itemA.setCheckState(0, Qt.Unchecked) # 0 is the column number</div><div>&nbsp;&nbsp; &nbsp; &nbsp;itemA1 = myNode('itemA1', 'on', 'this is item A1', itemA)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;itemB = myNode('itemB', 'on', 'this is item B', self.root)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;itemB1 = myNode('itemB1', 'on', 'this is item B1', itemB)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;itemC = myNode('itemC', 'on', 'this is item C',self.root)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;itemC1 = myNode('itemC1', 'on', 'this is item C1', itemC)</div><div><br></div><div>&nbsp;&nbsp; def
 supportedDropActions(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return Qt.CopyAction | Qt.MoveAction</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def flags(self, index):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;defaultFlags = QAbstractItemModel.flags(self, index)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if index.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return Qt.ItemIsEditable | Qt.ItemIsDragEnabled | \</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Qt.ItemIsDropEnabled | defaultFlags |Qt.ItemIsUserCheckable</div><div>&nbsp;&nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return Qt.ItemIsDropEnabled | defaultFlags | Qt.ItemIsUserCheckable</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def headerData(self, section, orientation, role):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if orientation == Qt.Horizontal and role == Qt.DisplayRole:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return
 QVariant(self.headers[section])</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return QVariant()</div><div><br></div><div>&nbsp;&nbsp; def mimeTypes(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;types = QStringList()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;types.append('application/x-ets-qt4-instance')</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return types</div><div><br></div><div>&nbsp;&nbsp; def mimeData(self, index):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;node = self.nodeFromIndex(index[0]) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div>&nbsp;&nbsp; &nbsp; &nbsp;mimeData =PyMimeData(node)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return mimeData</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def dropMimeData(self, mimedata, action, row, column, parentIndex):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if action == Qt.IgnoreAction:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return True</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;dragNode =
 mimedata.instance()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;parentNode = self.nodeFromIndex(parentIndex)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;# make an copy of the node being moved</div><div>&nbsp;&nbsp; &nbsp; &nbsp;newNode = deepcopy(dragNode)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;newNode.setParent(parentNode)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.insertRow(len(parentNode)-1, parentIndex)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),parentIndex, parentIndex)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return True</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def insertRow(self, row, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return self.insertRows(row, 1, parent)</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def insertRows(self, row, count, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.beginInsertRows(parent, row, (row + (count - 1)))</div><div>&nbsp;&nbsp; &nbsp;
 &nbsp;self.endInsertRows()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return True</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def removeRow(self, row, parentIndex):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return self.removeRows(row, 1, parentIndex)</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def removeRows(self, row, count, parentIndex):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.beginRemoveRows(parentIndex, row, row)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;node = self.nodeFromIndex(parentIndex)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;node.removeChild(row)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.endRemoveRows()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return True</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def index(self, row, column, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;node = self.nodeFromIndex(parent)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return self.createIndex(row, column,
 node.childAtRow(row))</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def data(self, index, role):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if role == Qt.DecorationRole:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QVariant()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if role == Qt.TextAlignmentRole:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QVariant(int(Qt.AlignTop | Qt.AlignLeft))</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if role != Qt.DisplayRole:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QVariant()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;node = self.nodeFromIndex(index)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if index.column() == 0:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QVariant(node.name)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;elif index.column() == 1:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QVariant(node.state)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;elif index.column() == 2:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return
 QVariant(node.description)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;else:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QVariant()</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def columnCount(self, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return self.columns</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def rowCount(self, parent):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;node = self.nodeFromIndex(parent)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if node is None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return 0</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return len(node)</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def parent(self, child):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if not child.isValid():</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QModelIndex()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;node = self.nodeFromIndex(child)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if node is None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;
 return QModelIndex()</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;parent = node.parent</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if parent is None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QModelIndex()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;grandparent = parent.parent</div><div>&nbsp;&nbsp; &nbsp; &nbsp;if grandparent is None:</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return QModelIndex()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;row = grandparent.rowOfChild(parent)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;assert row != - 1</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return self.createIndex(row, 0, parent)</div><div><br></div><div><br></div><div>&nbsp;&nbsp; def nodeFromIndex(self, index):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;return index.internalPointer() if index.isValid() else self.root</div><div><br></div><div><br></div><div><br></div><div>class myTreeView(QTreeView):</div><div>&nbsp;&nbsp; def __init__(self, parent=None):</div><div>&nbsp;&nbsp; &nbsp;
 &nbsp;super(myTreeView, self).__init__(parent)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.myModel = myModel()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.setModel(self.myModel)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;#item=self.currentItem()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;#item.setCheckState(0, Qt.Unchecked) # 0 is the column number</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.dragEnabled()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.acceptDrops()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.showDropIndicator()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.setDragDropMode(QAbstractItemView.InternalMove)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.connect(self.model(), SIGNAL("dataChanged(QModelIndex,QModelIndex)"), self.change)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.expandAll()</div><div><br></div><div>&nbsp;&nbsp; def change(self, topLeftIndex, bottomRightIndex):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.update(topLeftIndex)</div><div>&nbsp;&nbsp; &nbsp;
 &nbsp;self.expandAll()</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.expanded()</div><div>&nbsp;&nbsp; def expanded(self):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;for column in range(self.model().columnCount(QModelIndex())):</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; self.resizeColumnToContents(column)</div><div><br></div><div><br></div><div><br></div><div>class Ui_MainWindow(object):</div><div>&nbsp;&nbsp; def setupUi(self, MainWindow):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;MainWindow.setObjectName("MainWindow")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;MainWindow.resize(600, 400)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.centralwidget = QWidget(MainWindow)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.centralwidget.setObjectName("centralwidget")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.horizontalLayout = QHBoxLayout(self.centralwidget)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.horizontalLayout.setObjectName("horizontalLayout")</div><div>&nbsp;&nbsp; &nbsp;
 &nbsp;self.treeView = myTreeView(self.centralwidget)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.treeView.setObjectName("treeView")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.horizontalLayout.addWidget(self.treeView)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;MainWindow.setCentralWidget(self.centralwidget)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.menubar = QMenuBar(MainWindow)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.menubar.setGeometry(QRect(0, 0, 600, 22))</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.menubar.setObjectName("menubar")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;MainWindow.setMenuBar(self.menubar)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.statusbar = QStatusBar(MainWindow)</div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.statusbar.setObjectName("statusbar")</div><div>&nbsp;&nbsp; &nbsp; &nbsp;MainWindow.setStatusBar(self.statusbar)</div><div><br></div><div>&nbsp;&nbsp; &nbsp; &nbsp;self.retranslateUi(MainWindow)</div><div>&nbsp;&nbsp; &nbsp;
 &nbsp;QMetaObject.connectSlotsByName(MainWindow)</div><div><br></div><div>&nbsp;&nbsp; def retranslateUi(self, MainWindow):</div><div>&nbsp;&nbsp; &nbsp; &nbsp;MainWindow.setWindowTitle(QApplication.translate("MainWindow","MainWindow", None, QApplication.UnicodeUTF8))</div><div><br></div><div><br></div><div>if __name__ == "__main__":</div><div>&nbsp;&nbsp; app = QApplication(sys.argv)</div><div>&nbsp;&nbsp; MainWindow = QMainWindow()</div><div>&nbsp;&nbsp; ui = Ui_MainWindow()</div><div>&nbsp;&nbsp; ui.setupUi(MainWindow)</div><div>&nbsp;&nbsp; MainWindow.show()</div><div>&nbsp;&nbsp; sys.exit(app.exec_())</div><div><br></div><div>Is there a reason to employ one approach as compared to the other? &nbsp;&nbsp;</div></div><div style="position:fixed"></div></div><br>__________________________________________________<br>Do You Yahoo!?<br>Tired of spam?  Yahoo! Mail has the best spam protection around <br>http://mail.yahoo.com </body></html>