Alexandre Badez
Mon, 28 Apr 2008 00:48:28 -0700
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
#!/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 [EMAIL PROTECTED] ** ** 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_())
_______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt