Probleme: Delegate für einen DOM TreeView

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten

Waren die Angaben ausreichend?

Ja, passt...
1
100%
Naja, bissl genauer...
0
Keine Stimmen
Nein, zu ungenau oder unverständlich...
0
Keine Stimmen
 
Insgesamt abgegebene Stimmen: 1
Benutzeravatar
Traggger
User
Beiträge: 27
Registriert: Mittwoch 17. Dezember 2008, 11:33
Wohnort: Regensburg

Hallo erstmal mal an alle, bin zwar seit längerem angemeldet, aber das is mein erster Eintrag...

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_())
Neugierde
User
Beiträge: 2
Registriert: Samstag 23. Mai 2009, 15:25

Hallo,

wenn Du die Methode so veränderst

def flags(self, index):
if not index.isValid():
return QtCore.Qt.ItemIsEnabled

return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable

wird createEditor() aufgerufen.

Viele Grüsse
Antworten