[PyQt] Simple Dom Model with delegate
Alexandre Badez
alexandre.badez at gmail.com
Mon Apr 28 08:46:43 BST 2008
Hy,
I'm building a simple model and would like to make it editable via a
delegate editor.
I've made somes changes in simpledommodel.pyw to test it, but it do
not seems to work very well.
Any advices ?
My changes are marked with :
#========================================================
#=============== My Modif ===============================
.... my code here
#=============== End Modif =============================
#========================================================
--
Alex
-------------- next part --------------
#!/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 at 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()
#========================================================
#=============== My Modif ===============================
def setData(self, index, value, role):
print "set Data:", index.internalPointer().nodeName(), "value:", str(value.toString())
#=============== End Modif =============================
#========================================================
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()
#========================================================
#=============== My Modif ===============================
class Delegate(QtGui.QItemDelegate):
def createEditor(self, parent, option, index):
editor = QtGui.QLineEdit(parent)
editor.installEventFilter(self)
return editor
def setEditorData(self, editor, index):
uValue = unicode(
index.model().data(
index, QtCore.Qt.DisplayRole).toString())
editor.setText(uValue)
def setModelData(self, editor, model, index):
value = QtCore.QVariant(editor.text())
model.setData(index, value)
def updateEditorGeometryQWidget(self, editor, option, index):
editor.setGeometry(option.rect)
#=============== End Modif =============================
#========================================================
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)
#========================================================
#=============== My Modif ===============================
self.delegate = Delegate()
self.view.setItemDelegate(self.delegate)
self.view.setEditTriggers(QtGui.QAbstractItemView.SelectedClicked)
#=============== End Modif =============================
#========================================================
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_())
More information about the PyQt
mailing list