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 :

Changer de widget via une toolbar


Sujet :

PyQt Python

  1. #1
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut Changer de widget via une toolbar
    Salut,

    Je souhaite créer une interface qui serait composée d'une fenêtre principale (QMainWindow), d'un widget central (là où tout se passe) et d'une barre verticale gauche permettant de switcher entre différents widgets qui remplacent tour à tour le widget central. C'est sur ce dernier point que je sèche. Je pense que ce n'est pas compliqué, mais faute de vocabulaire je galère à trouver un exemple sur le net (et à expliquer clairement ce que je souhaite ici par la même occasion..).

    Pour ceux qui connaissent, je souhaite faire un peu ce que propose QtCreator: une barre vertical à gauche.

    Je suis parti pour cela sur une QToolBar.

    Voici une classe définissant un widget, pour l'exemple je créé plusieurs instances de ce même widget, mais à terme chacun représente une fenêtre bien plus complexe.
    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
    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    from functools import partial
     
    class MyWidget(QWidget):
     
        def __init__(self, parent=None, text=''):
            super(MyWidget, self).__init__(parent)
     
            label = QLabel(text)
            label.setAlignment(Qt.AlignCenter)
            label.setStyleSheet("QLabel {background-color: red;}")
            layout = QHBoxLayout()
            layout.addWidget(label)
            self.setLayout(layout)
     
            self.setVisible(False)
    Si je devais me limiter à cela je ferais:
    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
    class App(QMainWindow):
     
        def __init__(self, parent=None):
            super(App, self).__init__(parent)
     
            widget = MyWidget(self, 'Weeeeedget!')
            widget.setVisible(True)
            self.setCentralWidget(widget)
            self.show()
     
     
    if __name__ == '__main__':
     
        app = QApplication(sys.argv)
        form = App()
        sys.exit(app.exec_())
    Bien, maintenant ma QMainWindow (désolé, pour être executable il faut quelques images pour les QActions que je ne joins pas):
    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
    66
    67
    68
    69
    70
    71
    72
    class ToolBarDemo(QMainWindow):
     
        def __init__(self, parent=None):
            super(ToolBarDemo, self).__init__(parent)
            self.initUI()
     
        def initUI(self):
     
            self.init_toolbar()
            self.init_simu_panel()
     
            main_widget = QWidget(self)
     
            # Build some widgets
            self._widgets = {}
            for i in range(3):
                widget = MyWidget(self, 'Widget %i' % i)
                self.setCentralWidget(widget) # Probleme ici
                self._widgets[i] = widget
     
            self.setWindowTitle('Toolbar Demo!!')
            self.show()
     
        def init_simu_panel(self):
     
            toolbar = QToolBar('Simulations')
            toolbar.setOrientation(Qt.Vertical)
            toolbar.setMovable(False)
            toolbar.setFloatable(False)
            toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
            self.addToolBar(Qt.LeftToolBarArea, toolbar)
     
            action = QAction(QIcon('home.png'), 'Dummy', self)
            action.triggered.connect(partial(self.switch_widget, 0))
            toolbar.addAction(action)
     
            action = QAction(QIcon('home.png'), 'Dummy', self)
            action.triggered.connect(partial(self.switch_widget, 1))
            toolbar.addAction(action)
     
            action = QAction(QIcon('home.png'), 'Dummy', self)
            action.triggered.connect(partial(self.switch_widget, 2))
            toolbar.addAction(action)
     
        def init_toolbar(self):
     
            toolbar = QToolBar('Toolbar')
            toolbar.setOrientation(Qt.Horizontal)
            toolbar.setMovable(False)
            toolbar.setFloatable(False)
            self.addToolBar(toolbar)
     
            action = QAction(QIcon('run.png'), 'run', self)
            action.triggered.connect(self.cbk_run)
            toolbar.addAction(action)
     
            action = QAction(QIcon('stop.png'), 'stop', self)
            action.triggered.connect(self.cbk_stop)
            toolbar.addAction(action)
     
        def switch_widget(self, widget_id):
            for name, widget in self._widgets.items():
                if name == widget_id:
                    widget.setVisible(True)
                else:
                    widget.setVisible(False)
     
        def cbk_run(self):
            print('Ruuuuuuunnnn')
     
        def cbk_stop(self):
            print('STOP !!')
    A l'initialisation je crée plusieurs widgets que je stocke dans un dictionnaire. L'idée c'est de lié les QActionsde la barre verticale de sorte à rendre visible ou non le bon widget. Mon problème c'est que je ne vois pas comment placer ces widgets dans la fenêtre. Si je défini un layout j'ai droit à un message d'erreur car je mixe les layouts des widgets et de la fenêtre.
    Alors, comment placer tous ces widgets en mode "plein écran", centré, et les uns sur les autres?

    Peut-être que je fais fausse route et qu'il y a une autre voie pour faire ce genre de choses.

    Ciao,

    Julien

  2. #2
    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,

    Il ne peut y avoir qu'un seul centralWidget.

    Pour faire ce que tu veux, utilise un QStackedWidget, éventuellement tu peux en faire le centralWidget.

  3. #3
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut VinsS,

    The QStackedWidget class provides a stack of widgets where only one widget is visible at a time.
    Exactement ce que je recherchais. Merci beaucoup!

    Au cas où quelqu'un se poserait la même question, j'ai donc remplacé la partie création des widgets par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # Build some widgets
    self._widgets = QStackedWidget()
    self.setCentralWidget(self._widgets)
    for i in range(3):
        widget = MyWidget(self, 'Widget %i' % i)
        self._widgets.addWidget(widget)
    Et la partie permettant de switcher entre les widgets par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def switch_widget(self, widget_id):
        self._widgets.setCurrentIndex(widget_id)
    Julien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer texte JButton via une boucle
    Par Jb_One73 dans le forum AWT/Swing
    Réponses: 49
    Dernier message: 27/02/2015, 16h47
  2. Changer le CHMOD via une cmd FTP
    Par bilal_54 dans le forum Serveurs (Apache, IIS,...)
    Réponses: 3
    Dernier message: 09/10/2008, 23h29
  3. Réponses: 9
    Dernier message: 14/02/2007, 17h28
  4. Changer les droits sur un objet via une requete
    Par gg72160 dans le forum Sécurité
    Réponses: 1
    Dernier message: 10/06/2006, 21h14
  5. [C#] Changer couleur texte d'une toolbar
    Par djoao dans le forum Windows Forms
    Réponses: 15
    Dernier message: 01/05/2006, 19h32

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