setStyleSheet Attribute wieder auslesen

Alles rund um die Programmierung mit Qt
Antworten
Helmut Berg
Beiträge: 6
Registriert: 23. Februar 2010 10:03
Wohnort: Darmstadt

setStyleSheet Attribute wieder auslesen

Beitrag 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,
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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..
Helmut Berg
Beiträge: 6
Registriert: 23. Februar 2010 10:03
Wohnort: Darmstadt

Beitrag 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,
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich denke, wenn der PushButton im :pressed state ist, wird die Palette schon den korrekten Brush enthalten.
Helmut Berg
Beiträge: 6
Registriert: 23. Februar 2010 10:03
Wohnort: Darmstadt

Beitrag 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
Antworten