[gelöst] treeview Farbe ändern

Alles rund um die Programmierung mit Qt
Antworten
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

[gelöst] treeview Farbe ändern

Beitrag 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);
???
Zuletzt geändert von 24dan am 1. April 2010 23:59, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag 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)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag 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:
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag 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.
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag 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:
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Chris81T
Beiträge: 82
Registriert: 4. Mai 2008 00:06
Wohnort: Urbar

Beitrag 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!
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag 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:
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Antworten