Style Sheets: Nur QAction von QMenu manipulieren

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo Leute,

ich weiß, dass CSS nicht wirklich zu Python gehört. Aber da man im Zusammenhang mit Qt auch mit CSS arbeiten kann, versuche ich mal mein Glück. Nun, wie man QMenu() mittels CSS anspricht weiß ich. Sieht ungefähr so aus:

[codebox=css file=Unbenannt.css]
QMenu[objectName="context_menu_master_data"]
{
background:red;
}
[/code]

Aber wie spreche ich QAction() an? Konkret geht es mir darum, dass ich Icons anfügen will. Man könnte über QDesigner oder auch über PyQt alles erledigen. Die Sache ist nur, dass ich meine GUI dynamischer halten will. Denn mein derzeitiges Programm lädt die *.qss-Datei. Und dort möchte ich nahe zu alles festlegen. Je nach Theme ändern sich nicht nur die Farben auf den QWidgets, sondern auch die Icons.

Hat jemand eine Idee, wie ich dies bewältigen kann?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:
Gar nicht. QAction kann man nicht stylen, da es kein Widget ist sondern nur eine Aktion repräsentiert. Um da was zu stylen, müsstest Du an diekt an das Widget ran, was die Aktion darstellt. Das gelingt leider nicht immer, weil es für bestimmte Menüs nicht von Qt sondern vom OS kontrolliert wird. Probieren kannst Du noch QWidgetAction, überall wo Du das verwenden kannst, kannst Du auch stylen, weil Qt fürs Zeichnen verantwortlich ist.

Wenn es Dir nur ums Icon geht - explizit im Code setzen. Aber Obacht - überall dort, wo Qt nicht fürs Zeichnen verantwortlich ist, könnte der User Icons deaktiviert haben (kA ob das in allen gängigen OS konfigurierbar ist).
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Das ist wirklich ärgerlich. Dann blächt sich der Quelltext unnötig auf. Denn je nach Theme muss das Icon auch gewechselt werden. Wäre ja irrsinnig, wenn die Widget einen sehr dunklen Hintergrund haben und die Icons schwarz sind. Das heißt für mich, ich muss jedesmal abfragen, welches Theme verwendet wird und dann ensprechend mit PyQt steuern. Verdammt. Ich wollte diesen Teil in CSS verbannen, damit der Quelltext weitestgehend sauber bleibt und nicht aufgebläht wird.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du das willst, stell um auf electron. Dann hast du alle Möglichkeiten von HTML/CSS.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus:
Naja, Du kannst das immernoch halbwegs schick wegabstrahieren, z.B. mit theme-Ordnern, wo die Icons immer dem gleichen Pfad gehorchen. Dann musst Du nicht zig conditions abfragen/setzen, sondern nur einmal das Theme setzen und greifst dann immer auf den Subpfad zu.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@jerch: Deine Idee klingt plausibel. Ich stoße gerade auch bei QMessageBox an. Über QMessageBox kann man ja eigene Icons verwenden und auf die Standard-Icons gänzlich verzichten. Aber mittels CSS ist es mir nicht mal möglich, auch dort die Icons zu steuern. Mir scheint allgemein so, dass QT nur halbherzig CSS unterstützt. Kann das sein?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Sophus
Die Einschätzung ist etwas ungerecht, da CSS zur Gestaltung von HTML entwickelt wurde, eine QT-Oberfläche aber fest nichts gemein hat mit HTML Inhalten. Daher ist es logisch das QT "CSS" nicht unterstützt, man sollte die Gestaltungsmöglichkeiten eher als syntaktisch analoge Entwicklung verstehen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hmjanee. Das ginge schon durchaus alles Bzw deutlich mehr, aber da fehlt es an Konsequenz. Nicht umsonst wurde das QML stylesheet Plugin meines Kollegen Gregor mit einem Preis bedacht auf einer Qt Konferenz - weil die das trotz neuer und eigentlich dazu geeigneter Technologie nicht von Anfang an vorgesehen haben.

Und angesichts der modernen HTML GUIs ist klar, das die Technik das prinzipiell bringt. Muss Sophus halt auf Electron umstellen :)
Antworten