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 :

PySide 6 - Insertion d'une fenêtre dans une autre


Sujet :

PyQt Python

  1. #1
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 314
    Points : 204
    Points
    204
    Par défaut PySide 6 - Insertion d'une fenêtre dans une autre
    Bonjour à tous,

    JE reviens une nouvelle fois avec une petite question. J'ai construit deux fenêtres via Qt Designer (histoire de me faire la main).

    J'ai mis en place une classe main qui ouvre la première fenêtre. Dans une frame de cette première fenêtre je voudrais inséré, une seconde fenêtre.

    j'ai compris avec la doc, qui fallait utiliser "promote to", mais je n'arrive pas à comprendre dans quel sens se fait ce "promote to".


    J'ai trouvé quelques post sur stackoverflow mais j'avoue ne pas comprendre la logique. Pourriez vous me venir en aide sur cette nouvelle problématique.



    Je vous mets le code des trois classes :

    La classe main
    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
     
    import sys
    from PySide6.QtCore import *
    from PySide6.QtWidgets import *
    from PySide6.QtGui import *
     
     
    from Ui.wmp import Ui_MainWindow
     
    class Window(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self._setupUI()
     
        def _setupUI(self):
            self.setupUi(self)
     
        def add_second(self):
            pass
     
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = Window()
        win.show()
        sys.exit(app.exec())

    La classe principale qui doit recevoir la seconde
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    # -*- coding: utf-8 -*-
     
    from PySide6.QtCore import *  # type: ignore
    from PySide6.QtGui import *  # type: ignore
    from PySide6.QtWidgets import *  # type: ignore
     
     
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            if not MainWindow.objectName():
                MainWindow.setObjectName(u"MainWindow")
            MainWindow.setWindowModality(Qt.NonModal)
            MainWindow.resize(891, 603)
            MainWindow.setStyleSheet(u"background-color: #31363B;")
            self.centralwidget = QWidget(MainWindow)
            self.centralwidget.setObjectName(u"centralwidget")
            self.centralwidget.setStyleSheet(u"QFrame	#frame_left, #frame_right {\n"
    "	border-style: solid;\n"
    "	border-width: 2px;\n"
    "	border-color: rgb(175, 175, 175);\n"
    "}\n"
    "\n"
    "QPushButton {\n"
    "	background-color: #6086D1;\n"
    "	border-radius: 10px;\n"
    "	border-color: rgb(255, 255, 255);\n"
    "	font-size:18px;\n"
    "	color: #ffffff;\n"
    "}")
            self.horizontalLayout = QHBoxLayout(self.centralwidget)
            self.horizontalLayout.setObjectName(u"horizontalLayout")
            self.main_frame = QFrame(self.centralwidget)
            self.main_frame.setObjectName(u"main_frame")
            self.main_frame.setStyleSheet(u"")
            self.main_frame.setFrameShape(QFrame.StyledPanel)
            self.main_frame.setFrameShadow(QFrame.Raised)
            self.horizontalLayout_2 = QHBoxLayout(self.main_frame)
            self.horizontalLayout_2.setObjectName(u"horizontalLayout_2")
            self.frame_left = QFrame(self.main_frame)
            self.frame_left.setObjectName(u"frame_left")
            sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
            sizePolicy.setHorizontalStretch(0)
            sizePolicy.setVerticalStretch(0)
            sizePolicy.setHeightForWidth(self.frame_left.sizePolicy().hasHeightForWidth())
            self.frame_left.setSizePolicy(sizePolicy)
            self.frame_left.setMinimumSize(QSize(130, 0))
            self.frame_left.setMaximumSize(QSize(100, 16777215))
            self.frame_left.setStyleSheet(u"")
            self.frame_left.setFrameShape(QFrame.StyledPanel)
            self.frame_left.setFrameShadow(QFrame.Raised)
            self.pushButton = QPushButton(self.frame_left)
            self.pushButton.setObjectName(u"pushButton")
            self.pushButton.setGeometry(QRect(10, 430, 110, 71))
            self.pushButton.setMinimumSize(QSize(110, 0))
            self.pushButton.setStyleSheet(u"")
            self.Search = QPushButton(self.frame_left)
            self.Search.setObjectName(u"Search")
            self.Search.setGeometry(QRect(10, 10, 110, 71))
            self.Search.setMinimumSize(QSize(110, 0))
            self.Search.setStyleSheet(u"")
            self.destroy = QPushButton(self.frame_left)
            self.destroy.setObjectName(u"destroy")
            self.destroy.setGeometry(QRect(10, 90, 110, 71))
            self.destroy.setMinimumSize(QSize(110, 0))
            self.destroy.setStyleSheet(u"")
     
            self.horizontalLayout_2.addWidget(self.frame_left)
     
            self.frame_right = QFrame(self.main_frame)
            self.frame_right.setObjectName(u"frame_right")
            self.frame_right.setFrameShape(QFrame.StyledPanel)
            self.frame_right.setFrameShadow(QFrame.Raised)
     
            self.horizontalLayout_2.addWidget(self.frame_right)
     
     
            self.horizontalLayout.addWidget(self.main_frame)
     
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QMenuBar(MainWindow)
            self.menubar.setObjectName(u"menubar")
            self.menubar.setGeometry(QRect(0, 0, 891, 22))
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QStatusBar(MainWindow)
            self.statusbar.setObjectName(u"statusbar")
            MainWindow.setStatusBar(self.statusbar)
     
            self.retranslateUi(MainWindow)
     
            QMetaObject.connectSlotsByName(MainWindow)
        # setupUi
     
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MD5 verify", None))
            self.pushButton.setText(QCoreApplication.translate("MainWindow", u"Renommer", None))
            self.Search.setText(QCoreApplication.translate("MainWindow", u"Chercher", None))
            self.destroy.setText(QCoreApplication.translate("MainWindow", u"Effacer", None))
        # retranslateUi


    la seconde classe

    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
     
    # -*- coding: utf-8 -*-
    from PySide6.QtCore import *  # type: ignore
    from PySide6.QtGui import *  # type: ignore
    from PySide6.QtWidgets import *  # type: ignore
     
     
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            if not Dialog.objectName():
                Dialog.setObjectName(u"Dialog")
            Dialog.resize(210, 182)
            self.verticalLayout = QVBoxLayout(Dialog)
            self.verticalLayout.setObjectName(u"verticalLayout")
            self.lineEdit = QLineEdit(Dialog)
            self.lineEdit.setObjectName(u"lineEdit")
     
            self.verticalLayout.addWidget(self.lineEdit)
     
            self.pushButton = QPushButton(Dialog)
            self.pushButton.setObjectName(u"pushButton")
     
            self.verticalLayout.addWidget(self.pushButton)
     
     
            self.retranslateUi(Dialog)
     
            QMetaObject.connectSlotsByName(Dialog)
        # setupUi
     
        def retranslateUi(self, Dialog):
            Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None))
            self.pushButton.setText(QCoreApplication.translate("Dialog", u"PushButton", None))
        # retranslateUi

    Bonne fin de journée à tous

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par FadeToBlack Voir le message
    j'ai compris avec la doc, qui fallait utiliser "promote to", mais je n'arrive pas à comprendre dans quel sens se fait ce "promote to".
    Déjà le "promote to" ce n'est pas une instruction ou une fonction Qt, c'est un ordre de designer. Grosso-modo imaginons que tu crées ta propre classe (on va dire la classe "QPushToto") qui hérite d'un QPushButton, tu peux dans designer insérer un QPushToto à la place d'un QPushButton.
    D'abord tu mets le QPushButton qu'il faut là où il faut puis tu le sélectionnes et tu le changes en "QPushToto". Ca reste un QPushButton (puisqu'il en hérite) mais ça s'appelle "promotion" puisqu'il récupère en plus les avantages que tu as codés dans ton objet QPushToto.

    Mais je ne vois pas l'impérativité de cette opération pour placer deux fenêtres dans un QFrame. Si moi je voulais placer deux fenêtres dans un QFrame, je mettrais en place un gestionnaire de disposition (un Layout) dans le QFrame puis je mettrais mes deux fenêtres dans les différentes "cases" du layout. Après-tout, un QFrame c'est juste un QWidget amélioré. Donc un truc du style
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    frame=QFrame()
    wid1=QWidget()
    wid2=QWidget()
    layout=QVBoxLayout(frame)
    layout.addWidget(wid1)
    layout.addWidget(wid2)

    Tu peux d'ailleurs aller récupérer le source de cet exemple. Le premier objet (myWidget) est un QWidget incluant lui-même trois sous-widgets (un QPushButton, un QLCDNumber et un QSlider). Tu peux le changer de QWidget à QFrame le programme fonctionne pareil. Juste malheureusement il est sous PyQt et non PySide.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    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 480
    Points : 9 277
    Points
    9 277
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Recherche curieuse, mais solution possible.

    Insertion d'une fenêtre2 "QWidget" dans le "QFrame" d'une fenêtre1

    1- création dans QtDesigner d'une fenêtre1 "QWidget" avec un QFrame "frame" prenant toute la place dans la fenêtre grâce à un "QGridLayout"

    2- création dans QtDesigner d'une fenêtre2 "QWidget" qui contient un QLabel avec le texte: "toto"

    On convertit ces 2 fichiers "fenetre1_ui.ui" et "fenetre2_ui.ui""en 2 fichiers ".py"

    On crée le programme principal suivant:

    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtCore)
     
    # importation des paramètres QWidget définis dans QtDesigner
    from fenetre1_ui import Ui_Form as Ui_Form1
    from fenetre2_ui import Ui_Form as Ui_Form2
     
    #############################################################################
    class Fenetre2(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            # connexion aux paramètres définis dans QtDesigner
            self.ui = Ui_Form2()
            self.ui.setupUi(self)
     
    #############################################################################
    class Fenetre1(QtWidgets.QWidget):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            # connexion aux paramètres définis dans QtDesigner
            self.ui = Ui_Form1()
            self.ui.setupUi(self)
     
            self.fen2 = Fenetre2(self.ui.frame)
     
            layout = QtWidgets.QGridLayout()
            layout.addWidget(self.fen2, 0, 0)
            self.ui.frame.setLayout(layout)
     
     
    #############################################################################
    if __name__ == "__main__":
     
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre1()
        fen.show()
        sys.exit(app.exec_())
    A l'exécution, la fenêtre 1 s'affiche avec le texte "toto", qui prouve que la fenêtre 2 a bien été intégrée à l'intérieur de la fenêtre 1

  4. #4
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 314
    Points : 204
    Points
    204
    Par défaut
    Bonjour à vous deux,

    Désolé de ne pas avoir répondu plus tôt, mais j'étais vraiment pris ailleurs.

    je vous remercie de votre aide

    Je marque le post comme clos

    Bonne journée

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/03/2017, 12h46
  2. Trigger Insert vers une autre BASE
    Par zatura dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/10/2012, 12h40
  3. trigger qui realise une insertion sur une autre base
    Par kamy86 dans le forum Débuter
    Réponses: 1
    Dernier message: 21/07/2009, 15h29
  4. [Vxi] Insertion d'un rapport dans un autre
    Par kfmystik dans le forum Deski
    Réponses: 5
    Dernier message: 17/04/2009, 14h28
  5. [insertion de pages html dans d'autres pages]
    Par Patriarch24 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 07/03/2006, 14h56

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