Also schonmal "fett sorry" falls ich im falschen Thema bin, hab aber noch kein derartiges Problem gefunden hier...
Ich möchte mir einen XML Tree View basteln in dem man auch gleich die Inhalte der Tags editieren kann. Aus diesem Grund habe ich das "simpledommodel.py" aus den PyQt4-Examples zu Grunde gelegt.
So um nun die Spalten editiren zu können muß man sich ja einen eignen Delegate ( abgeleited von QItemDelegate) basteln, da (so hab ich das verstanden) der Standarddelegate das nicht macht...
Soweit so gut... Hab ich mir so ein Ding mal sauber implementiert nach der Anleitung. Und nun is das Problem, das der TreeView nicht auf die neu implementierte Funktion "createEditor" springt...
Ich bin hier fast am verzweifeln

Kann mir da irgendjemand helfen??
Code: Alles auswählen
#!/usr/bin/env python
import sys
from PyQt4 import QtCore, QtGui, QtXml
class myDelegate(QtGui.QItemDelegate):
def __init__(self, parent = None):
QtGui.QItemDelegate.__init__(self, parent)
def paint(self, painter, option, index):
if index.column() == 2:
value = index.model().data(index, QtCore.Qt.DisplayRole).toString()
myOption = QtGui.QStyleOptionViewItem(option)
myOption.DisplayAlignment = QtCore.Qt.AlignRight
#self.drawDisplay(painter, myOption, myOption.rect, str(value))
#self.drawFocus(painter, myOption, myOption.rect)
QtGui.QItemDelegate.paint(self, painter, myOption, index)
else:
QtGui.QItemDelegate.paint(self, painter, option, index)
def createEditor(self, parent, option, index):
print "xxx"
if index.column() != 2:
QtGui.QItemDelegate.createEditor(self, parent, option, index)
lineEdit = QtGui.QLineEdit(parent)
lineEdit.setFrame(True)
self.connect(lineEdit, QtCore.SIGNAL("editingFinished()"),
self.commitAndCloseEditor)
return lineEdit
def setEditorData(self, editor, index):
value = index.model().data(index, QtCore.Qt.DisplayRole)
editor.setText(value)
def setModelData(self, editor, model, index):
if not editor.isModified():
return
value = index.model().data(index, QtCore.Qt.DisplayRole)
model.setData(index, QtCore.QVariant(value), QtCore.Qt.DisplayRole)
model.setData(index, value, QtCore.Qt.DisplayRole)
def commitAndCloseEditor(self):
editor = self.sender()
self.emit(QtCore.SIGNAL("commitData(QWidget *)"), editor)
self.emit(QtCore.SIGNAL("closeEditor(QWidget *)"), editor)
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 = ""
delegate = myDelegate(self)
self.model = DomModel(QtXml.QDomDocument(), self)
self.view = QtGui.QTreeView(self)
#self.view.setSelectionBehavior(QtCore.Qt.SelectItems)
self.view.setModel(self.model)
self.view.setItemDelegate(delegate)
self.connect(self.view, QtCore.SIGNAL("itemDoubleClicked(doubleClicked(QModelIndex*,int))"), self.__slot_viewDblClicked)
self.setCentralWidget(self.view)
self.setWindowTitle(self.tr("Simple DOM Model"))
self.connect(self.view, QtCore.SIGNAL("currentChanged(const QModelIndex&,const QModelIndex&)"), self.__slot_viewDblClicked )
def __slot_viewDblClicked(self, x, y):
print "Hallo"
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_())