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 :

Séparer les QWidget du QMainWindow ?


Sujet :

PyQt Python

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2016
    Messages : 61
    Points : 42
    Points
    42
    Par défaut Séparer les QWidget du QMainWindow ?
    Hello,

    Avec les codes ci-dessous, j'ai bien une fenêtre qui s'ouvre, mais rien ne s'affiche. Savez-vous pourquoi?

    app.py
    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
     
    #!/usr/bin/env python
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QGridLayout
     
    from views import Main
     
    class TerraSoft(QMainWindow):
        def __init__(self, parent=None):
            super(TerraSoft, self).__init__(parent)
            self.setWindowTitle('TerraSoft')
            self.setWindowState(Qt.WindowMaximized)
     
            # load ihm
            self.main = Main(self)
            # Place ihm
            self._widget = QWidget()
            self._layout = QGridLayout(self._widget)
            self._layout.addWidget(self.main)
            self.setCentralWidget(self._widget)
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = TerraSoft()
        ex.show()
        sys.exit(app.exec_())
    views.py
    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
     
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QIcon
    from PyQt5.QtWidgets import QApplication, QWidget, qApp, QAction, QSplitter, QMenuBar, QToolBar, QGridLayout, QStatusBar
     
    from Family.views import FamilyTreeView
    from Specie.views import EventsTableView
     
    class Main(QWidget):
        """description of class"""
        def __init__(self, parent):
            super(Main, self).__init__(parent)
     
            # init menu
            menubar = QMenuBar()
            fileMenu = menubar.addMenu('File')
     
            #init toolbar
            exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
            exitAct.setShortcut('Ctrl+Q')
            exitAct.triggered.connect(qApp.quit)
     
            toolbar = QToolBar()
     
            # init elements of widget
            familyTreeView = FamilyTreeView(self)
            eventsTableView = EventsTableView(self)
     
            #init splitters
            HSplitter = QSplitter(Qt.Horizontal)
            VSplitter = QSplitter(Qt.Vertical)
     
            # add elements to splitters
            HSplitter.addWidget(familyTreeView)
            HSplitter.addWidget(eventsTableView)
     
     
            grid = QGridLayout()
            grid.addWidget(HSplitter)
     
            #status bar
            statusBar = QStatusBar().showMessage('Bienvenue dans TerraSoft')
    module: family/views.py
    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
     
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QStandardItemModel, QStandardItem
    from PyQt5.QtWidgets import QApplication, QWidget, QTreeView
     
    families = [
        ("Craspedocephalus", [
            ("puniceus", []),
            ("trigonocephalus", [])
        ]),
        ("Trimeresurus", [
            ("albolabris", [])
        ]),
        ("Elapidé", [])
    ]
     
    class FamilyTreeView(QWidget):
        """description of class"""
        def __init__(self, parent):
            super(FamilyTreeView, self).__init__(parent)
     
            self.familyList = QTreeView()
            self.familyList.setMaximumWidth(300)
     
            self.model = QStandardItemModel()
            self.addItems(self.model, families)
            self.familyList.setModel(self.model)
     
            self.model.setHorizontalHeaderLabels([self.tr("Familles")])
     
        def addItems(self, parent, elements):     
            for text, children in elements:
                item = QStandardItem(text)
                parent.appendRow(item)
                if children:
                    self.addItems(item, children)
    module: Specie/views.py
    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
     
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QStandardItemModel, QStandardItem
    from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTreeView
     
    class EventsTableView(QWidget):
        """description of class"""
        def __init__(self, parent):
            super(EventsTableView, self).__init__(parent)
     
            self.eventsTable = QTableWidget()
            self.eventsTable.setColumnCount(3)
            self.eventsTable.setHorizontalHeaderLabels(('Date', 'Catégorie', 'Description'))
    Je n'ai pas d'erreur en soit.

    Par avance, merci
    Cordialement,

    yagaam

  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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            grid = QGridLayout()
            grid.addWidget(HSplitter)
    Si ce QGridLayout reste sans parent, ça ne pourra jamais marcher.

    Je pense que tu auras le même problème avec les QTreeView et QTableView des autres fichiers, ils semblent orphelins eux aussi.

    Je te recommande d'utiliser le Designer pour voir comment on dispose les objets. Après, si tu veux séparer tes widgets, tu pourras toujours le faire.


    Ah oui, seule une QMainWindow peut avoir une QMenuBar et une QStatusBar, pas un widget.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2016
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2016
    Messages : 61
    Points : 42
    Points
    42
    Par défaut
    Salut,

    merci de ta réponse.

    J'ai apporté quelques modifications depuis (mais sans différence visuelle), voici mes nouveaux fichiers:

    app.py
    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
     
    #!/usr/bin/env python
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QIcon
    from PyQt5.QtWidgets import QApplication, qApp, QWidget, QMainWindow, QGridLayout, QMenuBar, QAction, QToolBar, QStatusBar
     
    from views import Main
     
    class TerraSoft(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            self.setWindowTitle('TerraSoft')
            self.setWindowState(Qt.WindowMaximized)
     
            # init menu
            menubar = QMenuBar()
            fileMenu = menubar.addMenu('File')
     
            #init toolbar
            exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
            exitAct.setShortcut('Ctrl+Q')
            exitAct.triggered.connect(qApp.quit)
     
            toolbar = QToolBar()
     
            # load ihm
            main = Main()
            centWidget = QWidget()
     
            # widget centralizer
            window = QGridLayout()
            window.addWidget(main, 0, 0)
            centWidget.setLayout(window)
     
            self.setCentralWidget(centWidget)
     
            #status bar
            statusBar = QStatusBar().showMessage('Bienvenue dans TerraSoft')
     
            # show ihm
            self.show()
            main.show()
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = TerraSoft()
        ex.show()
        sys.exit(app.exec_())
    views.py
    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
     
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QIcon
    from PyQt5.QtWidgets import QApplication, QWidget, qApp, QAction, QSplitter, QMenuBar, QToolBar, QGridLayout, QStatusBar
     
    from Family.views import FamilyTreeView
    from Specie.views import EventsTableView
     
    class Main(QWidget):
        """description of class"""
        def __init__(self, *args):
            QWidget.__init__(self, *args)
     
            # init elements of widget
            familyTreeView = FamilyTreeView(self)
            eventsTableView = EventsTableView(self)
     
            #init splitters
            HSplitter = QSplitter(Qt.Horizontal)
            VSplitter = QSplitter(Qt.Vertical)
     
            # add elements to splitters
            HSplitter.addWidget(familyTreeView)
            HSplitter.addWidget(eventsTableView)
     
     
            grid = QGridLayout()
            grid.addWidget(HSplitter)
    Family/views.py
    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
     
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QStandardItemModel, QStandardItem
    from PyQt5.QtWidgets import QApplication, QWidget, QTreeView
     
    families = [
        ("Craspedocephalus", [
            ("puniceus", []),
            ("trigonocephalus", [])
        ]),
        ("Trimeresurus", [
            ("albolabris", [])
        ]),
        ("Elapidé", [])
    ]
     
    class FamilyTreeView(QWidget):
        """description of class"""
        def __init__(self, *args):
            QWidget.__init__(self, *args)
     
            self.familyList = QTreeView()
            self.familyList.setMaximumWidth(300)
     
            self.model = QStandardItemModel()
            self.addItems(self.model, families)
            self.familyList.setModel(self.model)
     
            self.model.setHorizontalHeaderLabels([self.tr("Familles")])
     
        def addItems(self, parent, elements):     
            for text, children in elements:
                item = QStandardItem(text)
                parent.appendRow(item)
                if children:
                    self.addItems(item, children)
    specie/views.py
    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
     
    import sys
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QStandardItemModel, QStandardItem
    from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTreeView
     
    class EventsTableView(QTableWidget):
        """description of class"""
        def __init__(self, *args):
            QTableWidget.__init__(self, *args)
     
            self.eventsTable = QTableWidget()
            self.eventsTable.setColumnCount(3)
            self.eventsTable.setHorizontalHeaderLabels(('Date', 'Catégorie', 'Description'))

    À ce stade, je ne vois vraiment pas ce que je fais de faux ^^
    Cordialement,

    yagaam

  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
    Il manque toujours beaucoup de choses.

    Quelque chose comme ceci sera plus fonctionnel:
    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
     
    from PyQt5.QtCore import Qt
    from PyQt5.QtGui import QIcon
    from PyQt5.QtWidgets import (QApplication, qApp, QWidget, QMainWindow, 
                                 QGridLayout, QMenuBar, QAction, QToolBar, 
                                 QStatusBar)
     
    from views import Main
     
    class TerraSoft(QMainWindow):
        def __init__(self):
            QMainWindow.__init__(self)
            self.setWindowTitle('TerraSoft')
            self.setWindowState(Qt.WindowMaximized)
            centWidget = QWidget()
            self.main = Main(self)
            window = QGridLayout(centWidget)
            window.addWidget(self.main, 0, 0)
            self.setCentralWidget(centWidget)
     
            self.menubar = QMenuBar()
            self.fileMenu = menubar.addMenu('File')
            exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
            exitAct.setShortcut('Ctrl+Q')
            exitAct.triggered.connect(qApp.quit)
            self.fileMenu.addAction(exitAct)
            self.setMenuBar(self.menubar)
     
            self.toolbar = QToolBar()
            self.setToolBar(self.toolbar)
     
            self.statusBar = QStatusBar()
            self.setStatusBar(self.statusBar)
            self.statusBar.showMessage('Bienvenue dans TerraSoft')
     
            self.show()
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = TerraSoft()
        ex.show()
        sys.exit(app.exec_())
    Il faut absolument garder référence des widgets auquel tu devras accéder plus tard, le QTreeView et leQTableView par exemple.

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/10/2005, 15h18
  2. [Volume sonore] Comment séparer les volumes
    Par Manopower dans le forum Windows
    Réponses: 1
    Dernier message: 05/09/2005, 11h50
  3. [CR 10] Séparer les éléments d'un groupe
    Par Giovanny Temgoua dans le forum SAP Crystal Reports
    Réponses: 7
    Dernier message: 07/04/2005, 14h36
  4. Réponses: 4
    Dernier message: 10/02/2005, 16h10
  5. [TDataModule] Intérêt de séparer les accès aux données?
    Par Cornell dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/09/2003, 16h42

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