QTreeView + Stylesheet = kann Zellhintergrund nicht färben

Alles rund um die Programmierung mit Qt
Antworten
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

QTreeView + Stylesheet = kann Zellhintergrund nicht färben

Beitrag von tribari »

Hallo allerseits,

hab schon wieder ein ziemlich bescheidenes Problem. Auch wenn manche evtl. müde lächeln mögen... aber auf Basis der Qt-Doku und auch per Suche mit Google und so komme ich net weiter...

Ich stelle ein von QAbstractItemModel abgeleitetes Model in einem QTreeView dar.

Nun möchte ich in Spalte 3 den Wert der Zelle auswerten - und entsprechend die Hintergrundfarbe ändern...

1. Versuch:
In der data() Methode des Models auf Qt::BackgroundRole entsprechend reagiert. Und dann entsprechend QColor(farbwert) zurückgeben...

2. Versuch:
Eigenes Delegate erstellt und entsprechend painter->fillRect(option.rect,QColor(farbwert)) gesetzt und alles wie in der Doku beschrieben zurückgegeben...

Nichts davon funktioniert... nach frustierendem Suchen habe ich nun herausgefunden, dass mein Stylesheet die Farben einfach überschreibt...

Problem ist bloss dass ich einen Stylesheet für meine Applikation benötige - und dort werden halt auch die Items des QTreeView mit einer Hintergrundfarbe belegt... Schalte ich diesen aus - geht alles.

Nun hätte ich jedoch zumindest vom Delegate erwartet, dass dieser den Stylesheet für die jeweilige Darstellung überschreibt...

Wie kann ich mein Problem trotzdem lösen?

danke für die Hilfe im Voraus

mfg

Tribari
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Nichts davon funktioniert... nach frustierendem Suchen habe ich nun herausgefunden, dass mein Stylesheet die Farben einfach überschreibt...
wuerd ich ja fast wetten drauf, das er das nicht tut ^^
Da iss sicher was anderes faul ....
Nun möchte ich in Spalte 3 den Wert der Zelle auswerten
Spalte 3 zeigt die richtigen werte an ?
In der data() Methode des Models auf Qt::BackgroundRole entsprechend reagiert. Und dann entsprechend QColor(farbwert) zurückgeben...
Ich nehm an Du verwendest QT 4.x ...
Qt::BackgroundRole 8 The background brush used for items rendered with the default delegate. (QBrush)
Zu Deutsch, statt einem QVariant das ein QColor enthaelt, will er ein QVariant, das einen QBrush enthaelt
Nen Brush wiederum ist ne Kombi aus Muster + Farbe
QBrush ( const QColor & color, Qt::BrushStyle style = Qt::SolidPattern )
Kannst also den Brush direkt aus dem QColor erzeugen ...

Ciao ...
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag von tribari »

hallo rhbaum,

danke für die schnelle antwort...

also die werte in spalte 3 werden richtig angezeigt - sind integer werte welche ich auch direkt aus dem entsprechendem Item auslese... also nicht von der view.

per switch-case entscheide ich welche farbe dargestellt werden soll... in die case verzweigungen geht er auch wunderbar rein...

Die Variante mit QBrush habe ich auch schon getestet - selbes ergebnis - nur die Farben des style sheets...

Verwende Qt 4.6.3 - und laut doku bin ich auch der meinung das dies funktionieren müsste...

Code: Alles auswählen

 QVariant TreeModel::data(const QModelIndex &index, int role) const
{
 if (!index.isValid())
     return QVariant();

 if (role != Qt::DisplayRole && role != Qt::BackgroundRole)
     return QVariant();

 TreeItem *item = getItem(index);

 if(item){
    if(index.column()==3 && role==Qt::BackgroundRole)
    {
        switch(item->getState())
        {
             case 1: return QBrush(QColor(255,250,150));
             ......
        }
    }
 }
}
Oder habe ich da irgendwo nen Denkfehler? Also im Internet hab keine Lösung für dieses Problem gefunden - sondern nur Beiträge die ein ähnliches Problem festgestellt haben... aber leider ohne Lösung ;-)
Aber da ich mir auch net vorstellen kann, dass es am stylesheet liegt, wollte ich mal nachfragen :D

lg

tribari
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wie bei allen Indizes beim Programmieren startet auch column bei 0 :P
3. Spalte heißt column == 2.
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag von tribari »

ja da hast du recht - das war aber schon richtig... offiziell halt spalte 4 (hatte mich verschrieben weil ich immer in indexen denke). xD

hab jetzt aber des Rätsels Lösung gefunden - verdammt simpel - verdammt peinlich... aber was solls.

Also wenn jemand nochmal so ein Problem hat, hier die Lösung:

Delegate verwenden, und beim Delegate anlegen als parent einfach Null übergeben, anstatt eines QWidgets...

hätte ich mal früher dran denken können, dass der stylesheet ja auch vererbt wird...
trotzdem hätte ich gedacht, dass es spätestens beim Delegate die Darstellung des Stylesheets überschreibt.

what shalls...

Danke für die Hilfe ;)

lg

tribari
Nash
Beiträge: 118
Registriert: 27. April 2007 14:49

Beitrag von Nash »

Möchtest du die hintergrundfarbe des tabellen editors ändern oder der zelle?
Das sind zwei verschiedene paar, wird leider aus deinem Posting nicht deutlich.

Für ersteres brauchst du eine delegate. Denk drann das delegate selbst zu zerstören wenn du, aus welchen grund auch immer, kein parent übergibst.
tribari
Beiträge: 63
Registriert: 23. Juli 2008 13:31
Wohnort: Braunschweig

Beitrag von tribari »

ich wollte die hintergrundfarbe einer bestimmten zelle entsprechend ändern...
habe nun für das delegate auch das parent wieder mit übergeben... aber der stylesheet überschreibt die farben trotzdem.
also hab ich für QTreeView::item halt keine Background-Color gesetzt... sondern diese lege ich im delegate fest... nun gehts.

trotzdem komisch ;)
Antworten