Seite 1 von 1

[gelöst] treeview Farbe ändern

Verfasst: 26. März 2010 19:23
von 24dan
... wie kann ich die zwei sich wechselnen Farben in meinem QTreeView mit eigenen Farben setzen?
Bisher habe ich es nur geschafft die Farbe einer von den wechselnen Farben zu ändern. mit

Code: Alles auswählen

QPalette pal = ui->treeView->palette();
        pal.setColor(QPalette::Active, QPalette::AlternateBase, QColor(200, 200, 200));
        ui->treeView->setPalette(pal);
???

Verfasst: 29. März 2010 08:15
von Chris81T
Mit den Stylesheets könntest du es lösen. Schau mal dir die Beispiele / Referenzen zu an.

Oder in der reimplementierten data() Funktion des MOdells auf die passende Role reagieren. (Falls unterschiedliche Farben in Abhängigkeit der Daten angezeigt werden sollen)

Verfasst: 29. März 2010 10:55
von 24dan
Hi habe es bisher geschafft die Textfarbe meiner Zellen unterschiedlich einzufärben.

Benutze bisher dazu ein ItemDelegate() und könnte aber auch die data() im Modell auf die Qt::BackgroundRole reagieren lassen.


Mein Problem ist noch:

Wie ändere ich die Hintergrundfarbe der Zelle?
Muss ich dazu eventuell "alternatingRowColors" auf false setzen?

Mit

Code: Alles auswählen

        QPalette pal = ui->treeView->palette();
        pal.setColor(QPalette::Active, QPalette::AlternateBase, QColor(255, 252, 161));
        ui->treeView->setPalette(pal);
kann ich schon mal die eine Farbe der sich wechselnen Zeilen definieren.
Das gelingt mir über das ItemDelegate() auch.
Jedoch nicht für einzelne Spalten oder Zellen :cry:

Verfasst: 29. März 2010 21:19
von Chris81T
Hi,

schau mal hier in einem Post von mir http://qtforum.de/forum/viewtopic.php?t=9988&highlight=. Da siehst du die verschiedenen Farben. Pro Zeile verbirgt sich da ein eigenes Item. Pro Zeile sind drei Spalten. Alle drei QModelINdexe sind auf das eine Item pro Zeile indiziert.

Nun hatte ich da etwas getrickst, und den Alpha-Level auf 100 gesetzt. So das das alternating Row Color durchschimmert. Generell wird da in der data() Funktion nach der Background-Role geprüft und das Item gefragt, welche Hintergrundfarbe gewünscht ist. Diese wird zurückgegeben. Man erkennt an dem Screenshot, dass aber am Anfang die Bereiche nicht farbig gezeichnet werden, da die nicht zur Spalte, sag ich mal, zugehörig sind. Daher auch der Tipp mit dem Stylesheet. Da gibt's Beispiele dazu, dass man auch die Bereiche beeinflussen kann.

Nun gut, dass sollte noch ein Hinweis zu dem Thema farblicher Hintergrund sein, da du auch ein TreeView angegeben hast.

Generell sollte es doch gehen, dass du in der data() FUnktion des Models bei der passenden Role und deiner bestimmten Zelle (über das ModelIndex (row/column) prüfbar) die zugehörige Farbe zurückgibt. Also du willst in Zeile 2 die Spalte 3 rot hinterlegen, so sollte es doch dann gehen, würd ich mal sagen.

Verfasst: 30. März 2010 11:49
von 24dan
Genial, genau das habe ich gesucht.
Mir ist es auch nicht so wichtig das der Anfangsbereich noch farbig ist.
Und die AlphaWert Idee ist auch super von nutzen.

Wie hast Du zwischen den Kinder von zwei Root Elementen unterschieden?
Die laufen doch alle auf einen nicht genau zu unterscheiden ModelIndex auf.

Ich meine damit das ich wohl herausbekommen kann ob es eine Überschrift oder Kinder sind die jetzt eingefärbt werden, aber ich kann nicht so ohne weites aus dem ModelIndex herausbekommen ob es noch das gleiche Kinde vom letzten Root ist oder ich schon einen andere "Familie" habe.

Da müsste ich wohl über parent.index ran oder und dann herausbekommen wie die Eltern alle durchgezählt sind...???

Könntest du mir deine data() mal posten? :oops:

Verfasst: 30. März 2010 20:14
von Chris81T
Hi,
Könntest du mir deine data() mal posten?
Leider nein, da ich aktuell die Sourcen nicht zur Hand habe. Das ist aber auch weiterhin nicht schlimm, denn es ist einfach zu erklären.

Vorbild meines Projekts war das Qt Example Simple Dom Model. Dort wird auch ein eigenes Item implementiert, welches dann als Informationsträger vom Model genutzt wird.

Sogesehen werden die Items vom Model / View mit der index() Funktion indiziert. Das bedeutet ja widerum, dass in der data() vom ModelIndex über den internalPointer() auf das eigene Item zurückgegriffen werden kann. ( Siehe das Qt Beispiel ).

Tja, und da es sich um "mein" eigenes Item handelt, passiert da Folgendes:
Das Item weis, welche Hintergrundfarbe es besitzt, ob es als "Überschrift" fungiert usw.

Damit will ich sagen, dass bei der DisplayRole in der data() Funktion dann die Daten vom Item angefordert werden und bei der BackgroundRole dann die Farbinformationen des Items angefordert werden usw.

Beachte aber, dass auch in diesem Beispiel für alle drei Spalten (3 unterschiedliche QModelIndexe) das gleiche Item indiziert wird.

Ich hoff das hilft dir weiter, ansonsten meld dich!

Verfasst: 1. April 2010 23:59
von 24dan
Hallo und vielen Dank,
habe es jetzt geschafft meinen kompletten Treeview nach eigenen Wünschen farblich anzupassen.

Code: Alles auswählen

if (role == Qt::BackgroundRole){
      if (!index.parent().isValid())
          return QColor(Qt::darkGray);
      if (index.parent().row()==0 && index.row()%2==0 && index.column()<4 && !index.parent().parent().isValid())
          return QColor(255,204,0);
      if (index.parent().row()==0 && index.row()%2!=0 && index.column()<8 && index.parent().parent().isValid())
          return QColor(204,153,153);

  }
:wink: