from PyQt4.QtCore import QAbstractItemModel, QVariant, QString, QStringList from PyQt4.QtCore import QModelIndex from PyQt4.QtCore import Qt from PyQt4.QtXml import QDomNode from domItem import domItem class domModel(QAbstractItemModel): def __init__(self, document, parent = 0): QAbstractItemModel.__init__(self, parent) self.domDocument = document self.rootItem = domItem(document, 0); def data(self, index, role): if not index.isValid(): return QVariant() if role != Qt.DisplayRole: return QVariant() node = index.internalPointer().node() attributeMap = node.attributes() col = index.column() if col == 0: if node.nodeType() == QDomNode.ElementNode: qslist = QStringList() for i in range(attributeMap.count()): attr = attributeMap.item(i) elem = (attr.nodeName() .append(QString('="')) .append(attr.nodeValue()) .append(QString('"'))) qslist.append(elem) return (QString('<'). append(node.nodeName()). append(' '). append(qslist.join(' ')). append('>')) elif node.nodeType() == QDomNode.AttributeNode: return QString('Whozat?!') elif node.nodeType() == QDomNode.TextNode: return node.nodeValue() elif node.nodeType() == QDomNode.CDATASectionNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.EntityReferenceNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.EntityNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.ProcessingInstructionNode: return node.nodeName() elif node.nodeType() == QDomNode.CommentNode: return QString('#').append(node.nodeValue()) elif node.nodeType() == QDomNode.DocumentNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.DocumentTypeNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.DocumentFragmentNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.NotationNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.BaseNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.CharacterDataNode: return QString('unsupported node type') else: return QVariant() else: return QVariant() def flags(self, index): if not index.isValid(): return Qt.ItemIsEnabled # does this `|` thing hold? return Qt.ItemIsEnabled | Qt.ItemIsSelectable def headerData(self, section, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: if section == 0: return QString("Do I need an header?") else: return QVariant() else: return QVariant() def index(self, row, column, parent): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() childItem = parentItem.child(row) # childItem would be None to say "false"? if childItem: return self.createIndex(row, column, childItem) else: return QModelIndex() def parent(self, child): if not child.isValid(): return QModelIndex() childItem = child.internalPointer() parentItem = childItem.parent() if not parentItem or parentItem == self.rootItem: return 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 columnCount(self, parent): # just one column # we'll print tag name (and attributes) # or the tag content return 1