#!/usr/bin/env python """*************************************************************************** ** ** Copyright (C) 2005-2005 Trolltech AS. All rights reserved. ** ** This file is part of the example classes of the Qt Toolkit. ** ** This file may be used under the terms of the GNU General Public ** License version 2.0 as published by the Free Software Foundation ** and appearing in the file LICENSE.GPL included in the packaging of ** this file. Please review the following information to ensure GNU ** General Public Licensing requirements will be met: ** http://www.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.com. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ***************************************************************************""" import sys from PyQt4 import QtCore, QtGui, QtXml 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) 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 row < 0 or column < 0 or row >= self.rowCount(parent) or column >= self.columnCount(parent): return QtCore.QModelIndex() 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 parent.column() > 0: return 0 if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() return parentItem.node().childNodes().count() class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QMainWindow.__init__(self, parent) self.fileMenu = self.menuBar().addMenu(self.tr("&File")) self.fileMenu.addAction(self.tr("&Open..."), self.openFile, QtGui.QKeySequence(self.tr("Ctrl+O"))) self.fileMenu.addAction(self.tr("E&xit"), self, QtCore.SLOT("close()"), QtGui.QKeySequence(self.tr("Ctrl+Q"))) self.xmlPath = "" self.model = DomModel(QtXml.QDomDocument(), self) self.view = QtGui.QTreeView(self) self.view.setModel(self.model) self.setCentralWidget(self.view) self.setWindowTitle(self.tr("Simple DOM Model")) def openFile(self): filePath = QtGui.QFileDialog.getOpenFileName(self, self.tr("Open File"), self.xmlPath, self.tr("XML files (*.xml);;HTML files (*.html);;" "SVG files (*.svg);;User Interface files (*.ui)")) if not filePath.isEmpty(): f = QtCore.QFile(filePath) if f.open(QtCore.QIODevice.ReadOnly): document = QtXml.QDomDocument() if document.setContent(f): newModel = DomModel(document, self) self.view.setModel(newModel) self.model = newModel self.xmlPath = filePath f.close() if __name__ == "__main__": app = QtGui.QApplication(sys.argv) window = MainWindow() window.resize(640, 480) window.show() sys.exit(app.exec_())