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 :

besoin de conseils pour widget/layout dépliant


Sujet :

PyQt Python

  1. #1
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut besoin de conseils pour widget/layout dépliant
    Bonjour,

    Je cherche le moyen le plus efficace de faire un menu dépliant, et je n'es pas vu de widget qui fait cela.
    Pour l'instant je suis plus dans le comment faire plutôt que dans le code, est ce un bouton qui addWidget /removeWidget est la meilleure solution?
    y'as t'il plus simple ?

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne sais pas ce que tu entends par "menu dépliant".

    Certains widgets supporte les menus "classiques" comme QMainWindow. On peut aussi en mettre dans les autres widgets qui contiennent une méthode "setMenu".

    Voilà un exemple avec un QPushButton: on voit que cette solution permet de choisir une action parmi d'autres du clic sur le bouton.

    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
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.bouton = QtWidgets.QPushButton("bouton", self)
     
            # création du menu pour le bouton
            self.menubouton = QtWidgets.QMenu(self.bouton)
     
            actionTest1 = self.menubouton.addAction("Jaune")
            actionTest1.triggered.connect(self.test1)
            # 
            actionTest2 = self.menubouton.addAction("Vert clair")
            actionTest2.triggered.connect(self.test2)
            # 
            self.menubouton.addSeparator()
            #
            actionTest3 = self.menubouton.addAction("Couleur par défaut")
            actionTest3.triggered.connect(self.test3)
            # 
            self.bouton.setMenu(self.menubouton)
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            self.setLayout(posit)
     
        #========================================================================
        def test1(self):
            self.bouton.setStyleSheet("background-color:yellow;")
     
        #========================================================================
        def test2(self):
            self.bouton.setStyleSheet("background-color:lightgreen;")
     
        #========================================================================
        def test3(self):
            self.bouton.setStyleSheet("")
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    On peut aussi créer des menus contextuels (ou popup) qui surgissent avec un clic droit de souris.

    Voilà un exemple avec un QPushButton. On voit que cette solution ne modifie pas la fonction principale du bouton (le clic => une action), mais ajoute d'autres actions possibles, ici des changements de couleurs.

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.bouton = QtWidgets.QPushButton("bouton", self)
            self.bouton.clicked.connect(self.clictest)
     
            # création du menu contextuel
            self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
            self.customContextMenuRequested.connect(self.popupmenu)
     
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.bouton, 0, 0)
            self.setLayout(posit)
     
        #========================================================================
        def popupmenu(self, position):
            """Menu contextuel
            """
            popupmenu = QtWidgets.QMenu(self)
     
            actionTest1 = popupmenu.addAction("Jaune")
            actionTest1.triggered.connect(self.test1)
     
            actionTest2 = popupmenu.addAction("Vert clair")
            actionTest2.triggered.connect(self.test2)
     
            popupmenu.addSeparator()
     
            actionTest3 = popupmenu.addAction("Couleur par défaut")
            actionTest3.triggered.connect(self.test3)
     
            popupmenu.exec_(self.mapToGlobal(position))
     
        #========================================================================
        def clictest(self):
            QtWidgets.QMessageBox.information(self, "Information", "Clic bouton")
     
        #========================================================================
        def test1(self):
            self.bouton.setStyleSheet("background-color:yellow;")
     
        #========================================================================
        def test2(self):
            self.bouton.setStyleSheet("background-color:lightgreen;")
     
        #========================================================================
        def test3(self):
            self.bouton.setStyleSheet("")
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec_())
    Et pour les widgets qui ont déjà un menu contextuel, on peut remplacer ce menu ou simplement le modifier en ajoutant des items.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Bonjour,
    Merci de votre aide, j'admet que ma demande est floue et qu'un exemple aurais aider à comprendre se que je souhaite faire.
    Un exemple :
    Nom : Sans titre.png
Affichages : 365
Taille : 4,7 Ko

    J'ai également vus que les widgets ont comme propriétés visible, est-ce que se serais plus approprié que d'utiliser addWidget / removeWidget ?

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ce sont des QComboBox ça, très simple d'utilisation, d'ailleurs.

    Je te recommande d'utiliser le Designer de Qt il a l'avantage de te permettre de paramétrer chaque widget dès la création de la fenêtre et t'épargne de nombreuses heures que tu aurais du consacrer à la documentation.

  5. #5
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Je ne parle pas des combobox mais bien des boutons qui permettent de faire apparaître les label et combobox
    Nom : Sans titre.png
Affichages : 390
Taille : 6,1 Ko

  6. #6
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Je te recommande d'utiliser le Designer de Qt il a l'avantage de te permettre de paramétrer chaque widget dès la création de la fenêtre et t'épargne de nombreuses heures que tu aurais du consacrer à la documentation.
    Je te recommande de lire entre les lignes

  7. #7
    Membre éclairé
    Homme Profil pro
    BTS SN IR
    Inscrit en
    Mai 2017
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : BTS SN IR

    Informations forums :
    Inscription : Mai 2017
    Messages : 513
    Points : 700
    Points
    700
    Par défaut
    J'ai avancé un peu:
    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
     
    from PyQt5 import QtWidgets, QtGui, QtCore
    import sys
     
    app = QtWidgets.QApplication(sys.argv)
     
    class Depliant(QtWidgets.QWidget):
    	def __init__(self, parent=None):
    		self.open = True
    		QtWidgets.QWidget.__init__(self, parent=parent)
    		self.layout = QtWidgets.QVBoxLayout(self)
    		self.button = QtWidgets.QPushButton("+")
    		self.button.setFixedSize(20, 20)
    		self.button.clicked.connect(self.switch)
    		self.layout.addWidget(self.button)
    		self.content = QtWidgets.QWidget()
    		self.layout.addWidget(self.content)
    		self.content_layout = QtWidgets.QGridLayout(self.content)
     
    	def addWidget(self, widget, row, column):
    		self.content_layout.addWidget(widget, row, column)
     
    	def switch(self):
    		if self.open == True:
    			self.open = False
    		else:
    			self.open = True
    		self.content.setVisible(self.open)
     
     
    class Main:
    	def __init__(self):
    		w = QtWidgets.QMainWindow()
    		central_widget = QtWidgets.QWidget()
    		w.setCentralWidget(central_widget)
    		layout = QtWidgets.QGridLayout(central_widget)
    		a = Depliant()
    		layout.addWidget(a, 1, 1)
    		a.addWidget(QtWidgets.QLabel("test"), 0, 0)
    		a.addWidget(QtWidgets.QLabel("test"), 1, 0)
    Y'as encore pas mal à faire mais sa peut déjà donner une idée de se que je compte faire

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/12/2008, 17h32
  2. Besoin de conseils pour une application
    Par peredodu dans le forum Access
    Réponses: 9
    Dernier message: 05/03/2006, 11h18
  3. Réponses: 13
    Dernier message: 13/09/2005, 09h41
  4. Réponses: 4
    Dernier message: 20/05/2005, 13h30
  5. Réponses: 3
    Dernier message: 24/12/2004, 12h21

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