Ich habe ein QTreeView mit entsprechendem Model. Jeder Eintrag besteht (neben dem Icon) aus Text, der aus einer oder mehreren Zeilen besteht. Selbstverständlich soll jedes Item nur soviel Platz bekommen, wie es tatsächlich benötigt. Da QTreeView ohnehin keinen RichText unterstützt, habe ich also auch gleich einen Delegaten erzeugt, und dessen sizeHint() und paint() implementiert. Das Problem: Um den benötigten Platz zu ermitteln, benötige ich die zur Verfügung stehende Breite, denn die soll das Item natürlich ausnutzen. sizeHint() bekommt im QStyleOptionViewItem zwar ein QRect übergeben, aber dieses enthält ungültige Werte und kann somit nicht dafür verwendet werden. Also habe ich im Wesentlichen zwei Möglichkeiten:
- Ich berücksichtige die Breite nicht weiter und hoffe, dass der Text passt. Den vollständigen Text kann ich dann immer noch im Tooltip anzeigen.
- Ich berechne die Höhe anhand einer beliebigen Breite. Damit gehe ich das Risiko ein, dass entweder nicht die volle Breite ausgenutzt wird bzw. abgeschnitten wird, oder dass die Höhe, die ich angegeben habe, zu hoch ist und damit unangenehme Freiräume zwischen den Items entstehen.
Also Option 3:
Wie kann ich die einem Item tatsächlich zur Verfügung stehende Breite berechnen? Es handelt sich dabei leider nicht um die Client-Breite des TreeViews, weil ein Item ja eingerückt sein kann und ich glaube, ich kann nicht ohne Probleme ermitteln, wie weit es eingerückt ist (in Pixeln). Aber vielleicht irre ich mich ja und deshalb bitte ich um Erleuchtung 8)