Ist es möglich, die Farbe eines Griffs eines QSliders entsprechend seiner Position zu ändern?

8

Ich habe ziemlich gut verstanden, wie man einen QSlider über Stylesheets anpasst, aber ich frage mich, ob es möglich ist, Folgendes zu tun:

Ich möchte, dass der Schieberegler von blau nach gelb wechselt. Wenn es auf der linken Seite ist, ist es blau; und wenn Sie es nach rechts bewegen, wird es einen Farbverlauf von blau nach gelb haben.

Wenn es durch die Stylesheets möglich ist, wie? Und wenn nicht, wie kann ich das im paintEvent einer Unterklasse eines QSliders implementieren?

    
IAmInPLS 19.10.2016, 13:18
quelle

2 Antworten

10

Eigentlich müssen Sie nichts wirklich Besonderes machen, denn der stock QSlider hat bereits das valueChanged(int) Signal, also können Sie das mit einer Funktion verbinden, die die beiden Farben basierend auf der Position mischt und den Stil festlegt Farbe. Hier ist ein minimales Beispiel:

%Vor%

Dies funktioniert für jeden Slider-Bereich und jede Ausrichtung, der Code findet im Prinzip die relative Griffposition im Bereich von 0.0 bis 1.0 und verwendet diese, um die Farben from und to zu mischen, um die Handle-Farbe auf den entsprechenden Wert einzustellen. Seltsamerweise hatte QColor nicht die Operatoren zum Multiplizieren und Addieren, was ziemlich praktisch sein kann.

Zusätzlich können Sie, anstatt zwischen zwei Farben zu mischen, eine Farbe im HSL-Format erstellen, die Ihnen einen leicht unterschiedlichen Verlauf verleiht. Wenn Sie from/to von QColor in die Farben 42 bzw. 202 ändern, können Sie Folgendes tun:

%Vor%

Dies gibt Ihnen einen Farbsweep für den Farbton, anstatt zwischen zwei festen Farben zu mischen, was im Kontext der Temperatur besser anwendbar ist:

Beachte, dass du jetzt in der Mitte eine cyan-ische Farbe anstelle von "Zombie" grün erhältst und du kommst durch sauberes Grün, bevor du zu Orange kommst.

    
dtech 21.10.2016, 20:34
quelle
4

Ich glaube nicht, dass Sie dies mit einem einfachen Stylesheet tun können. Aber das ist leicht machbar, wenn Sie QSlider class spezialisieren und ein entsprechendes Stylesheet anwenden, wenn der Benutzer den Cursor bewegt (zB: wenn valueChanged wird ausgegeben).

Hier ist eine Klasse, die ich geschrieben habe, die den Trick macht. Es funktioniert für horizontale und vertikale Cursor und kann angepasst werden, um jede Farbe zu verwenden. Es erstellt ein QImage von QLinearGradient zum Speichern der Verlaufsfarbpalette. Wenn sich der Schiebereglerwert ändert, wird die entsprechende Farbe aus dem Bild basierend auf der Position des Schiebereglers extrahiert und durch ein Stylesheet angewendet.

Es wurde versucht, die Klasse für die Wiederverwendbarkeit generisch zu machen, aber es könnte vereinfacht werden, wenn Sie Farben nicht anpassen müssen und nur horizontale Schieberegler verwenden müssen.

gradientengleiter.h:

%Vor%

gradientengleiter.cpp:

%Vor%

Nun mach einfach:

%Vor%

Die Farben QColor(79,174,231) (~ blue) und QColor(251,192,22) (~ yellow) wurden aus dem Bild des ursprünglichen Fragenposts übernommen und können durch Qt::blue , Qt::yellow (mit leicht unterschiedlicher Färbung) ersetzt werden. .

Das wird es tun:

    
jpo38 21.10.2016 19:28
quelle

Tags und Links