QTreeView + Delegate / variable item width

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hey servus,

Ich versuche aktuell einen QTreeView mit Daten zu füttern, bei deren Darstellung ein QItemDelegate verwendet wird. Es existiert nur eine einzelne Column, jedes TopLevelItem hat exakt 1 Level an ChildItems, weiter geht die Hierarchie nicht.

Was ich nun gern erreichen will, ist dass der Delegate unterschiedliche Breiten der Items zulässt. Die Breite ist essentiell, da sie eine zeitliche Dauer repräsentiert und nicht skaliert dargestellt werden soll.

Bild

Wie im Bild dargestellt, sollen die ItemGroups der Breite des Views folgen, die SubItems aber fixe Breiten gemäß ihrer Daten besitzen. Ich hoffe die Zeichnung erläutert mein Vorhaben.

Probiert habe ich folgendes:
stretchLastSection des QHeaderView auf true/false, beides hat nicht die gewünschte Wirkung.
sizeHint im Delegate ist implementiert und gibt die gewünschte Breiten zurück, aber scheinbar werden diese ignoriert.

Das Snippet dazu sieht so aus ( sorry, kein Python ;-) ):

Code: Alles auswählen

        int itemWidth = parentView_->width();

        if (!isGroup)
        {
            {
                itemWidth = duration * DATACELL_WIDTH;
            }
        }

        return QSize(itemWidth, TRACK_HEIGHT);
DATACELL_WIDTH ist konstant 25 (px), TRACK_HEIGHT ist konstant 20 (px).

Ich erreiche entweder, dass alle Items auf die Breite des Views gezeichnet werden, oder dass die Column manuell/interaktiv manipuliert werden muss. Bei letzterem konnte ich durch resizeSection des QHeaderView zwar die Column auf die gewünschte Länge bringen, aber damit werden auch alle anderen Items automatisch in ihrer Breite angepasst.

Ist mein Anliegen mit dem QTreeView/QItemDelegate überhaupt möglich? Selbst ein funktionierender Workaround würde mir erst ein mal helfen.
Vielleicht hat jemand eine Idee.

Falls noch was unklar ist, bitte einfach melden, ich erklär es gern im Detail.

Vielen Dank im Voraus,
~Mad
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Madmartigan:
Vermutlich wird das nur mit heftigen Eingriffen in den Treeview gelingen, zumindest ist mir nichts bekannt, was das rechte Zellenaligment per API ausschaltet. Falls Du es nur im Delegate brauchst, könntest Du es über das zu rendernde Subwidget abbilden. Wahrscheinlich fährst Du aber mit einer eigenen Viewimplementation besser bzw. kommst schneller zum Ziel.
Antworten