IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

stylesheet en cascade sur plusieurs QLabel


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2022
    Messages : 18
    Points : 9
    Points
    9
    Par défaut stylesheet en cascade sur plusieurs QLabel
    Bonjour.
    je voudrais changer le style de plusieurs QLabel,
    lorsque j'enchaine 2 setStyleSheet , seul le dernier est prit en compte.

    ex:
    j'ai 2 QLabel (label1 et label2) le nom est defini dans QT designer

    self.dlg.setStyleSheet("QLabel#label1{color : blue;background-color: green}")
    self.dlg.setStyleSheet("QLabel#label2{color : blue;background-color: red}")

    je ne vois pas où est le soucis, je passe bien par des ID selector pourtant.

    merci de m’éclairer.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2022
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    si je fais :

    self.dlg.label1.setStyleSheet("background-color: red")
    self.dlg.label2.setStyleSheet("background-color: blue")

    pas de soucis, ca marche.
    mais je veux une solution pour pouvoir "boucler" sur une liste de QLabel car je veux modifier l'apparence de certains labels (pas tous) et j'en ai beaucoup.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    A vous lire, on dirait que vous ne savez pas faire une boucle sur une liste de... ce qui semble "bizarre" puisque ce sont des bases à connaitre avant de se perdre dans Qt.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2022
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    si je boucle (2 fois), seul le dernier setstylesheet est prit en compte, ou du moins le premier setstylesheet est remis à défaut.
    si mon premier exemple ne fonctionne pas, inutile de boucler, ça marchera pas mieux après.

  5. #5
    Membre habitué
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 131
    Points : 186
    Points
    186
    Par défaut
    Salut,

    Effectivement, tel quel ça ne fonctionne pas, il faut les passer en une seule fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    from PyQt6 import QtCore
    from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit
     
     
    class Ui_Labels(object):
        def setupUi(self, Labels):
            Labels.setWindowTitle("Labels")
            Labels.setObjectName("Labels")
            Labels.resize(253, 219)
            self.vLayoutWidget = QWidget(parent=Labels)
            self.vLayoutWidget.setGeometry(QtCore.QRect(10, 20, 231, 182))
            self.vLayoutWidget.setObjectName("vLayoutWidget")
            self.verticalLayout = QVBoxLayout(self.vLayoutWidget)
            self.verticalLayout.setContentsMargins(0, 0, 0, 0)
            self.verticalLayout.setObjectName("verticalLayout")
     
            self.label1 = QLabel(parent=self.vLayoutWidget)
            self.label1.setObjectName("label1")
            self.label1.setText("Label_1")
            self.verticalLayout.addWidget(self.label1)
            self.lineEdit1 = QLineEdit(parent=self.vLayoutWidget)
            self.lineEdit1.setObjectName("lineEdit1")
            self.verticalLayout.addWidget(self.lineEdit1)
     
            self.label2 = QLabel(parent=self.vLayoutWidget)
            self.label2.setObjectName("label2")
            self.label2.setText("Label_2")
            self.verticalLayout.addWidget(self.label2)
            self.lineEdit2 = QLineEdit(parent=self.vLayoutWidget)
            self.lineEdit2.setObjectName("lineEdit2")
            self.verticalLayout.addWidget(self.lineEdit2)
     
            self.label3 = QLabel(parent=self.vLayoutWidget)
            self.label3.setObjectName("label3")
            self.label3.setText("Label_3")
            self.verticalLayout.addWidget(self.label3)
            self.lineEdit3 = QLineEdit(parent=self.vLayoutWidget)
            self.lineEdit3.setObjectName("lineEdit3")
            self.verticalLayout.addWidget(self.lineEdit3)
     
            self.vLayoutWidget.setStyleSheet(
                """QLabel#label1{color : blue; background-color: green}
                QLabel#label2{color : blue; background-color: red}
                QLabel#label3{color : blue; background-color: yellow}"""
            )
     
     
    if __name__ == "__main__":
        import sys
     
        app = QApplication(sys.argv)
        Labels = QWidget()
        ui = Ui_Labels()
        ui.setupUi(Labels)
        Labels.show()
        sys.exit(app.exec())
    Maintenant, si tu dois utiliser une boucle, rien ne t'empêche d'itérer sur tes widgets label et d'appliquer ta "customisation"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CUSTOM_WIDGETS = ("color : blue; background-color: green", 
                            "color : blue; background-color: red",
                            "color : blue; background-color: yellow")
     
    for i, label in enumerate(self.vLayoutWidget.findChildren(QLabel)):
        label.setStyleSheet(CUSTOM_WIDGETS[i])

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2022
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2022
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    merci, nickel.

    mais j'aimerais bien savoir pk je ne peux pas enchainer les setstylesheet en utilisant les selecteurs d'ID ? c'est fait pour ca il me semble.

  7. #7
    Membre habitué
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 131
    Points : 186
    Points
    186
    Par défaut
    Salut,

    Pour moi, ce comportement est normal.
    Lors de l'appel de la méthode, si les objets (via type et id) et le style à appliquer ne sont pas passés en paramètre, ils utilisent leurs palettes par défaut.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Une solution que j'utilise consiste à déclarer des style dans un fichier QSS et à jouer sur la propriété "class".
    Ici avec un bouton :
    Code QSS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    QPushButton.letter {
        background-color: #FFFFFF;
        color:#002C52;
        border:1px solid #0046FE;
    }
     
    QPushButton.correct {
        color:#FFFFFF;
        background-color:#0046FE;
    }
     
    QPushButton.wrong {
        color:#FFFFFF;
        background-color:#FF5C35;
        border:1px solid #FF5C35;
    }

    Puis lorsque je crée mon bouton.
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    button.setProperty("class", "letter")

    En cas de mise à jour de la classe, genre après le clic :
    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     if self._worker.try_letter(letter):
          button.setProperty("class", "correct")
    else:
          button.setProperty("class", "wrong")
    button.style().polish(button)

    Et dans le main :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with open("Hangman.qss", "r") as f:
          style = f.read()
          app.setStyleSheet(style)

Discussions similaires

  1. [XL-365] MAJ automatique de listes déroulantes en cascades sur plusieurs onglets
    Par IcemanY15 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/08/2021, 15h24
  2. [AC-2013] Liste en cascade sur plusieurs tables
    Par fremarnat dans le forum IHM
    Réponses: 5
    Dernier message: 17/10/2013, 15h54
  3. [2008R2] Relations en cascade sur plusieurs tables
    Par Piou2fois dans le forum Développement
    Réponses: 9
    Dernier message: 24/04/2013, 10h24
  4. Requete sur plusieurs tables en cascade
    Par Lamanne dans le forum Requêtes
    Réponses: 10
    Dernier message: 12/02/2009, 14h14
  5. [ZF 1.5] Suppression en cascade sur plusieurs niveaux
    Par Janitrix dans le forum Zend_Db
    Réponses: 12
    Dernier message: 12/05/2008, 02h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo