Seite 1 von 1

setStyleSheet Attribute wieder auslesen

Verfasst: 21. April 2010 18:16
von Helmut Berg
Hallo,

ich schlage mich gerade mit den Stylesheets herum:
Wenn ich zum Beispiel einen Farbverlauf für einen gecheckten Button über setStyleSheet setze

QPushButton:checked{
background-color:qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0
rgb(110,110,110,255), stop: 0.2
rgba(200, 200, 200,255), stop:1
rgb(255, 255, 255, 255));
color:black;
border-color:black;
}

funktioniert das soweit prima, der Button wird wie gewünscht gezeichnet.
Ich möchte aber jetzt die Zeichenroutine des Buttons selber schreiben, weil mein Button keine Standardform hat. Dabei möchte ich die gesetzten Styles auslesen, und z.B. die entsprechenden Attribute wie Brush, Textfarbe, Font etc. verwenden.
Gibt es irgendwo eine Beschreibung, wie ich im paintEvent einer von QPushButton abgeleiteten Klasse, die gesetzten Styleattribute auslesen kann, oder kennt jemand eine andere Methode um Steuerelemente mit exotischem Aussehen unter der Berücksichtung von Stylesheets selber zu zeichnen? Samples wie "NorwegianWood" haben mir nicht weitergeholfen, weil hier nicht auf Stylesheet Properties eingegangen wird.

Vielen Dank für eure Hilfe,

Verfasst: 22. April 2010 08:52
von solarix
im paintEvent einer von QPushButton abgeleiteten Klasse
Naja.. ich würde davon ausgehen, dass QPushButton beim Setzten des Stylesheets halt einfach die entsprechenden Membervariabeln (in diesem Fall die Palette) entsprechend setzt...

Die drei Farben in deinem Beispiel

QPushButton:checked{
background-color:qlineargradient(x1:0, y1:0, x2:0, y2:1,stop:0
rgb(110,110,110,255), stop: 0.2
rgba(200, 200, 200,255), stop:1
rgb(255, 255, 255, 255)
);
color:black;
border-color:black;
}

Wirst du vermutlich mit

Code: Alles auswählen

 ... paintEvent(..) 
{
  if (palette().brush(QPalette::Background).gradient())
      qDebug() << palette().brush(QPalette::Background).gradient()->stops();
}
erhalten...

hth..

Verfasst: 22. April 2010 10:19
von Helmut Berg
Hallo solarix.
Was Du sagst, klappt, wenn ich den normalen QPushbutton Style setze. Aber an eine Brush die z.B. nur für den Pressed State gesetzt ist, komme ich so nicht drann, sie taucht nirgendwo in der Palette auf. (Habe mal alle Brushelemente der Palette durchitteriert)

Beispiel:

QString style = QString::fromUtf8(
"QPushButton{"
"background-color:qlineargradient("
"x1:0, y1:0, x2:0, y2:1,stop:0 "
"rgb(60,60,60), stop: 0.4 "
"rgb(130, 130, 130), stop:1 "
"rgb(130, 130, 130));"
"color: white;"
"}"
"QPushButton:pressed{"
"background-color:qlineargradient("
"x1:0, y1:0, x2:0, y2:1,stop:0 "
"rgb(110,110,110), stop: 0.2 "
"rgb(200, 200, 200), stop:1 "
"rgb(255, 255, 255));"
"color:black;"
"}" );

Die Backgroundbrush von QPushButton bekomme ich, die von QPushButton :pressed nicht.

Irgendeine Idee?

Viele Grüße,

Verfasst: 22. April 2010 10:29
von franzf
Ich denke, wenn der PushButton im :pressed state ist, wird die Palette schon den korrekten Brush enthalten.

Verfasst: 22. April 2010 15:35
von Helmut Berg
Hallo,

ich habe das jetzt etwas genauer analysiert, mit folgendem Ergebnis:

1) Wenn für ein QWidget ein StyleSheetStyle definiert wurde, wird die virtuelle Funktion drawControl der von QStyle abgeleiteten Klasse QStyleSheetStyle zum Zeichnen verwendet.

2) Diese Funktion ruft zuerst einmal QRenderRule auf, die alle definierten Styleinformationen (auch die in den Elternfenstern definierten Infos) zusammensammelt. Bei dieser Klasse werden dann zum gegebenen Zeitpunkt die entsprechenden Fonts, Brushes, etc. angefragt.

3) Leider sind sowohl QStyleSheetStyle als auch QRenderRule nicht für den Programierer zugänglich, und ich habe keine Möglichkeit gefunden, mich so dazwischenzuklemmen, dass ich nach Setzen der richtigen Palette selber zeichnen kann. Insofern muss ich den Versuch wohl aufgeben...

Wenn jemandem zu diesem Thema noch etwas einfällt, bitte posten...

Viele Grüße