[PyQt][résolu] Style dynamique

Style dynamique [PyQt][résolu] - Python - Programmation

Marsh Posté le 02-05-2020 à 17:03:21    

Bonjour,
 
J'ai toujours mon projet de mediacenter avec une raspi et un écran LCD qui n'a pas l'air de passionner les foules :o.
 
Il se trouve que des couleurs claires sont très bien quand il fait jour, mais pètent les yeux pendant la nuit, et que des couleurs sombres ([:gandalf-ze-wizard]) fonctionnent bien la nuit mais on ne voit rien pendant la journée. De façon pratique, ça colle avec le moment où la lumière est allumée.
 
Est-ce qu'il y a un moyen de changer de feuilles de styles en fonction d'une variable, mais sans redémarrer le programme?
 
Le code contient juste ce bloc dans l'initialisation de la classe du QWidget parent d'à peu près tout.

Code :
  1. style = QtCore.QFile(config.STYLESHEET)
  2. style.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text)
  3. self.setStyleSheet(QtCore.QTextStream(style).readAll())
  4. style.close()


 
Si je le rajoute ailleurs (en cliquant sur un bouton par exemple), ça applique bien la feuille de style au QWidget parent, mais pas à tout ce qui est inclu dedans.
 
Jour [:dracospina:1] :
http://www.monorailc.at/data/galleries/2020_dashboard/uit17_light.png
Nuit [:simi37:4] :
http://www.monorailc.at/data/galleries/2020_dashboard/uit17_dark.png
Bâtard :
http://www.monorailc.at/data/galleries/2020_dashboard/uit17_fail.png
 
Comment puis-je faire?


Message édité par Manisque le 03-05-2020 à 16:26:17

---------------
Si tu bois froid juste après le potage chaud, ça va faire sauter l'émail de tes dents - Monorailcat iz ohverin
Reply

Marsh Posté le 02-05-2020 à 17:03:21   

Reply

Marsh Posté le 03-05-2020 à 12:31:07    

Tout d'abord, bravo pour ton projet :jap:
 
j'ai fait un peu de python, mais qt je ne connais pas, donc je vais surement dire des bêtises :o
tu as bien 2 fichiers css ou qss distincts pour chaque theme ?
quel est le code exact quand tu testes avec un bouton ?

Reply

Marsh Posté le 03-05-2020 à 14:20:58    

citation a écrit :

Tout d'abord, bravo pour ton projet :jap:

 

j'ai fait un peu de python, mais qt je ne connais pas, donc je vais surement dire des bêtises :o
tu as bien 2 fichiers css ou qss distincts pour chaque theme ?
quel est le code exact quand tu testes avec un bouton ?

 

En fait je réutilise des boutons existants qui appellent un simple copier/coller du code plus haut.

 

En effet, j'ai deux fichiers css distincts :jap:.

 

Je pense que la feuille de style est appellée pour la première fois avant que le reste des classes ne soient instanciées, du coup le style s'applique sur tout ce qui va être instancié. Quand je clique sur le bouton pour changer de couleur, ça ne s'applique que sur le QWidget en question.


Message édité par Manisque le 03-05-2020 à 14:23:57

---------------
Si tu bois froid juste après le potage chaud, ça va faire sauter l'émail de tes dents - Monorailcat iz ohverin
Reply

Marsh Posté le 03-05-2020 à 14:56:00    

dans ton copié collé, si tu remplaces self par le nom de ton widget principal ça fait quoi ?
 
edit : a quel moment tu changes config.STYLESHEET ?

Message cité 1 fois
Message édité par citation le 03-05-2020 à 14:57:20
Reply

Marsh Posté le 03-05-2020 à 15:07:48    

citation a écrit :

dans ton copié collé, si tu remplaces self par le nom de ton widget principal ça fait quoi ?
 
edit : a quel moment tu changes config.STYLESHEET ?


 
self est le QWidget principal :o.
 
Mais oui, ça fonctionne si j'applique le stylesheet à chaque widgets un par un (y-compris les boutons et les zones de texte :o).
C'est possible, mais pas vraiment réaliste ni modulable.
 
En fait sur les boutons, j'ai remplacé config.STYLESHEET par le nom du fichier en dur. C'est moche, mais c'est juste pour tester.


---------------
Si tu bois froid juste après le potage chaud, ça va faire sauter l'émail de tes dents - Monorailcat iz ohverin
Reply

Marsh Posté le 03-05-2020 à 15:18:27    

ok pour le self :whistle:  
 
de ce que j'ai compris, tu peux définir une fonction dans ton qwidget principal
cette fonction (que tu peux appeler set_theme par exemple) doit avoir pour paramètre un nom_de_fichier
et c'est dans cette fonction que tu fais ton setStyleSheet, avec style = QtCore.QFile(nom_de_fichier)
 
puis tu pourras appeler cette fonction depuis n'importe quel widget, avec en paramètre le nom du css voulu
 
si l'anglais ne te rebutes pas, j'ai lu ça ici :
https://stackoverflow.com/questions [...] qt-widgets

Reply

Marsh Posté le 03-05-2020 à 16:21:45    

citation a écrit :

ok pour le self :whistle:

 

de ce que j'ai compris, tu peux définir une fonction dans ton qwidget principal
cette fonction (que tu peux appeler set_theme par exemple) doit avoir pour paramètre un nom_de_fichier
et c'est dans cette fonction que tu fais ton setStyleSheet, avec style = QtCore.QFile(nom_de_fichier)

 

puis tu pourras appeler cette fonction depuis n'importe quel widget, avec en paramètre le nom du css voulu

 

C'est à peu près ça, j'ai une classe principale qui contient le QWidget principal, quelques sous-QWidgets et des fonctions pour faire fonctionner le bouzin (boutons, touches de clavier). La fonction qui applique les feuilles de style est dans cette classe.
Ce qui n'est pas indispensable dans la classe principale est dégagé dans d'autres classes qui sont dans d'autres fichiers.

 
citation a écrit :

si l'anglais ne te rebutes pas, j'ai lu ça ici :
https://stackoverflow.com/questions [...] qt-widgets

 

Merci :jap:.

 

En fait il fallait appliquer le style sur le QApplication au lieu du QWidget parent, là ça fonctionne (ça pète d'autres trucs, mais c'est un détail :o).

 

Je ne serais pas allé loin si je m'étais limité à la doc en Français, en oubliant les forums de Qt et stackoverflow :o.


Message édité par Manisque le 03-05-2020 à 16:26:53

---------------
Si tu bois froid juste après le potage chaud, ça va faire sauter l'émail de tes dents - Monorailcat iz ohverin
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed