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()