Implementieren eines Delegaten für Wordwrap in einem QTreeView (Qt / PySide / PyQt)?

Ich habe eine Baumansicht mit einem benutzerdefinierten Delegaten, dem ich die Funktion zum Zeilenumbruch hinzufügen möchte. Der Zeilenumbruch funktioniert einwandfrei, aber dassizeHint() scheint nicht zu funktionieren. Wenn der Text umbrochen wird, wird die entsprechende Zeile nicht erweitert, um sie einzuschließen.

Ich dachte, ich kümmere mich darum insizeHint() durch Rückgabe vondocument.size().height().

def sizeHint(self, option, index):
    text = index.model().data(index)
    document = QtGui.QTextDocument()
    document.setHtml(text) 
    document.setTextWidth(option.rect.width())  
    return QtCore.QSize(document.idealWidth(), document.size().height())    

Allerdings, wenn ich druckedocument.size().height() es ist für jeden Artikel gleich.

Auch wenn ich die Höhe manuell einstelle (zum Beispiel auf 75), um zu überprüfen, ob die Dinge vernünftig aussehen, sieht der Baum so aus, als ob ein Goldfisch von einer Panzerfaust erschossen wurde (das heißt, es ist ein Durcheinander):

Wie Sie sehen, ist der Text in jeder Zeile im Baum nicht richtig ausgerichtet.

Ähnliche Beiträge

Ähnliche Probleme sind bereits aufgetreten, aber es gibt keine Lösung für mein Problem (die Leute sagen normalerweise, dass es neu implementiert werden sollsizeHint(), und das versuche ich):

QTreeWidget Höhe jeder Zeile abhängig vom Inhalt festlegen

QTreeView benutzerdefinierte Zeilenhöhe einzelner Zeilen

http: //www.qtcentre.org/threads/1289-QT4-QTreeView-and-rows-with-multiple-line

SSCCE

import sys
from PySide import QtGui, QtCore

class SimpleTree(QtGui.QTreeView):
    def __init__(self, parent = None):    
        QtGui.QTreeView.__init__(self, parent)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setGeometry(500,200, 400, 300)  
        self.setUniformRowHeights(False) #optimize: but for word wrap, we don't want this!
        print "uniform heights in tree?", self.uniformRowHeights()
        self.model = QtGui.QStandardItemModel()
        self.model.setHorizontalHeaderLabels(['Task', 'Description'])
        self.setModel(self.model)
        self.rootItem = self.model.invisibleRootItem()
        item0 = [QtGui.QStandardItem('Sneeze'), QtGui.QStandardItem('You have been blocked up')]
        item00 = [QtGui.QStandardItem('Tickle nose, this is a very long entry. Row should resize.'), QtGui.QStandardItem('Key first step')]
        item1 = [QtGui.QStandardItem('<b>Get a job</b>'), QtGui.QStandardItem('Do not blow it')]
        self.rootItem.appendRow(item0)
        item0[0].appendRow(item00) 
        self.rootItem.appendRow(item1)
        self.setColumnWidth(0,150)
        self.expandAll()
        self.setWordWrap(True)
        self.setItemDelegate(ItemWordWrap(self))

class ItemWordWrap(QtGui.QStyledItemDelegate):
    def __init__(self, parent=None):
        QtGui.QStyledItemDelegate.__init__(self, parent)
        self.parent = parent
    def paint(self, painter, option, index):
        text = index.model().data(index) 
        document = QtGui.QTextDocument() # #print "dir(document)", dir(document)
        document.setHtml(text)       
        document.setTextWidth(option.rect.width())  #keeps text from spilling over into adjacent rect
        painter.save() 
        painter.translate(option.rect.x(), option.rect.y()) 
        document.drawContents(painter)  #draw the document with the painter
        painter.restore()
    def sizeHint(self, option, index):
        #Size should depend on number of lines wrapped
        text = index.model().data(index)
        document = QtGui.QTextDocument()
        document.setHtml(text) 
        document.setTextWidth(option.rect.width())  
        return QtCore.QSize(document.idealWidth() + 10,  document.size().height())       

def main():
    app = QtGui.QApplication(sys.argv)
    myTree = SimpleTree()
    myTree.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

Antworten auf die Frage(2)

Ihre Antwort auf die Frage