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 :

PyQt6 et évènements dans une fenetre modale


Sujet :

PyQt Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Points : 0
    Points
    0
    Par défaut PyQt6 et évènements dans une fenetre modale
    Bonjour,

    N'étant pas encore à l'aise avec PyQt, j'ai tenté de réaliser une appli avec fenêtre principale et une fenêtre modale (appelée "paramètres" sans trop bien réfléchir sur son nom) dans laquelle j'ai certaines actions à réaliser avant de renvoyer certaines données. Pour le moment, je ne me suis pas penché sur la question du retour de ces données. Mon problème, actuellement est l'interaction avec les évènements et les widgets. Je mets ci-dessous le bout de code de la fenêtre modale qui s'ouvre bien à l'appel du bouton de la fenêtre principale. Pour info, les fenêtres ont été réalisées avec QT6.6.2.


    # -*- coding: utf-8 -*-

    ################################################################################
    ## Form generated from reading UI file 'ParametresDraJYv.ui'
    ##
    ## Created by: Qt User Interface Compiler version 6.6.2
    ##
    ## WARNING! All changes made in this file will be lost when recompiling UI file!
    ################################################################################

    from PyQt6.QtCore import QCoreApplication, QMetaObject, QRect, QSize, Qt, QIODevice, pyqtSlot
    from PyQt6.QtGui import QCursor, QFont, QIcon
    from PyQt6.QtWidgets import QComboBox, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QSizePolicy, QSpinBox, QVBoxLayout, QWidget, QPushButton

    from PyQt6.QtSerialPort import QSerialPort, QSerialPortInfo

    class Ui_Parametres(object):
    def setupUi(self, Parametres):
    self.port = QSerialPort()
    if not Parametres.objectName():
    Parametres.setObjectName(u"Parametres")
    Parametres.setWindowModality(Qt.WindowModality.WindowModal)
    Parametres.resize(482, 500)
    Parametres.setTabletTracking(False)
    Parametres.setContextMenuPolicy(Qt.ContextMenuPolicy.DefaultContextMenu)
    icon = QIcon()
    icon.addFile(u"config 32x32.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
    Parametres.setWindowIcon(icon)
    Parametres.setSizeGripEnabled(False)
    Parametres.setModal(True)
    self.gridLayoutWidget = QWidget(Parametres)
    self.gridLayoutWidget.setObjectName(u"gridLayoutWidget")
    self.gridLayoutWidget.setGeometry(QRect(0, 0, 481, 471))
    self.gridLayout = QGridLayout(self.gridLayoutWidget)
    self.gridLayout.setSpacing(0)
    self.gridLayout.setObjectName(u"gridLayout")
    self.gridLayout.setContentsMargins(0, 0, 0, 0)
    self.verticalLayout_2 = QVBoxLayout()
    self.verticalLayout_2.setSpacing(0)

    ...

    self.gridLayout.addLayout(self.verticalLayout_4, 2, 0, 1, 2)

    self.verticalLayout_5 = QVBoxLayout()
    self.verticalLayout_5.setObjectName(u"verticalLayout_5")
    self.verticalLayout_5.setContentsMargins(-1, -1, 0, -1)
    self.pushButtonConnect = QPushButton(u"Connexion", self.gridLayoutWidget)
    self.pushButtonConnect.setObjectName(u"pushButtonConnect")
    self.pushButtonConnect.setMinimumSize(QSize(80, 30))
    self.pushButtonConnect.setMaximumSize(QSize(80, 30))

    self.verticalLayout_5.addWidget(self.pushButtonConnect, 0, Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignBottom)


    self.gridLayout.addLayout(self.verticalLayout_5, 3, 0, 1, 1)

    self.verticalLayout_7 = QVBoxLayout()
    self.verticalLayout_7.setObjectName(u"verticalLayout_7")
    self.verticalLayout_7.setContentsMargins(10, -1, -1, -1)
    self.pushButtonCancel = QPushButton(u"Annuler",self.gridLayoutWidget)
    self.pushButtonCancel.setObjectName(u"pushButtonCancel")
    self.pushButtonCancel.setMinimumSize(QSize(80, 30))
    self.pushButtonCancel.setMaximumSize(QSize(76, 30))

    self.verticalLayout_7.addWidget(self.pushButtonCancel, 0, Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignBottom)

    self.gridLayout.addLayout(self.verticalLayout_7, 3, 1, 1, 1)

    self.retranslateUi(Parametres)

    self.pushButtonConnect.clicked.connect(self.onButtonChanged)
    self.pushButtonCancel.clicked.connect(Parametres.close)

    QMetaObject.connectSlotsByName(Parametres)
    # setupUi

    def retranslateUi(self, Parametres):
    Parametres.setWindowTitle(QCoreApplication.translate("Parametres", u"Param\u00e8tres de connexion", None))
    ...
    # retranslateUi

    def onButtonChanged(self, Parametres):
    print("Super!!")
    #self.status_port.setText(QCoreApplication.translate("Parametres", "New and Updated Text", None))
    self.status_port.setText("New and Updated Text")


    Dans ce programme, la fenêtre s'affiche bien mais je n'arrive pas, en cliquant sur le "pushButtonConnect" à avoir le résultat escompté à l'appel de la méthode "onButtonChanged". Avant toutes mes modifications, le fichier d'origine utilisait un "QDialogButtonBox" qui ne fonctionnait pas aussi (enfin que je n'arrivais pas à ...). J'ai donc fais mes modifs persos et le bouton de fermeture fonctionne (50% de réussite.... encore que le programme n'est pas terminé :icon_cry.gif:.
    Quelqu'un aurait-il une idée pour résoudre ce problème?
    Si cela est nécessaire, je peux retourner le code complet (environ 400 lignes pour cette fenêtre modale).

    Merci beaucoup par avance

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 578
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 578
    Points : 2 022
    Points
    2 022
    Par défaut
    Citation Envoyé par lacodav Voir le message
    Si cela est nécessaire, je peux retourner le code complet (environ 400 lignes pour cette fenêtre modale).
    Ce qui serait bien, déjà, c'est de présenter autrement le code publié.

    L'indentation ayant une grande importance avec Python hein...

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Points : 0
    Points
    0
    Par défaut
    ..... Je n'avais pas vu et prévu cette problématique. Merci pour ce retour Arioch.

    Je mets le code avec son indentation correctement ainsi que le message que j'avais placé en fin de code :

    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
     
    # -*- coding: utf-8 -*-
     
    ################################################################################
    ## Form generated from reading UI file 'ParametresDraJYv.ui'
    ##
    ## Created by: Qt User Interface Compiler version 6.6.2
    ##
    ## WARNING! All changes made in this file will be lost when recompiling UI file!
    ################################################################################
     
    from PyQt6.QtCore import QCoreApplication, QMetaObject, QRect, QSize, Qt,  QIODevice,  pyqtSlot
    from PyQt6.QtGui import QCursor, QFont, QIcon
    from PyQt6.QtWidgets import QComboBox, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QSizePolicy, QSpinBox, QVBoxLayout, QWidget,  QPushButton
     
    from PyQt6.QtSerialPort import QSerialPort, QSerialPortInfo
     
    class Ui_Parametres(object):
        def setupUi(self, Parametres):
            self.port = QSerialPort()
            if not Parametres.objectName():
                Parametres.setObjectName(u"Parametres")
            Parametres.setWindowModality(Qt.WindowModality.WindowModal)
            Parametres.resize(482, 500)
            Parametres.setTabletTracking(False)
            Parametres.setContextMenuPolicy(Qt.ContextMenuPolicy.DefaultContextMenu)
            icon = QIcon()
            icon.addFile(u"config 32x32.png", QSize(), QIcon.Mode.Normal, QIcon.State.Off)
            Parametres.setWindowIcon(icon)
            Parametres.setSizeGripEnabled(False)
            Parametres.setModal(True)
            self.gridLayoutWidget = QWidget(Parametres)
            self.gridLayoutWidget.setObjectName(u"gridLayoutWidget")
            self.gridLayoutWidget.setGeometry(QRect(0, 0, 481, 471))
            self.gridLayout = QGridLayout(self.gridLayoutWidget)
            self.gridLayout.setSpacing(0)
            self.gridLayout.setObjectName(u"gridLayout")
            self.gridLayout.setContentsMargins(0, 0, 0, 0)
            self.verticalLayout_2 = QVBoxLayout()
            self.verticalLayout_2.setSpacing(0)
     
            ...
     
            self.gridLayout.addLayout(self.verticalLayout_4, 2, 0, 1, 2)
     
            self.verticalLayout_5 = QVBoxLayout()
            self.verticalLayout_5.setObjectName(u"verticalLayout_5")
            self.verticalLayout_5.setContentsMargins(-1, -1, 0, -1)
            self.pushButtonConnect = QPushButton(u"Connexion", self.gridLayoutWidget)
            self.pushButtonConnect.setObjectName(u"pushButtonConnect")
            self.pushButtonConnect.setMinimumSize(QSize(80, 30))
            self.pushButtonConnect.setMaximumSize(QSize(80, 30))
     
            self.verticalLayout_5.addWidget(self.pushButtonConnect, 0, Qt.AlignmentFlag.AlignRight|Qt.AlignmentFlag.AlignBottom)
     
     
            self.gridLayout.addLayout(self.verticalLayout_5, 3, 0, 1, 1)
     
            self.verticalLayout_7 = QVBoxLayout()
            self.verticalLayout_7.setObjectName(u"verticalLayout_7")
            self.verticalLayout_7.setContentsMargins(10, -1, -1, -1)
            self.pushButtonCancel = QPushButton(u"Annuler",self.gridLayoutWidget)
            self.pushButtonCancel.setObjectName(u"pushButtonCancel")
            self.pushButtonCancel.setMinimumSize(QSize(80, 30))
            self.pushButtonCancel.setMaximumSize(QSize(76, 30))
     
            self.verticalLayout_7.addWidget(self.pushButtonCancel, 0, Qt.AlignmentFlag.AlignLeft|Qt.AlignmentFlag.AlignBottom)
     
            self.gridLayout.addLayout(self.verticalLayout_7, 3, 1, 1, 1)
     
            self.retranslateUi(Parametres)
     
            self.pushButtonConnect.clicked.connect(self.onButtonChanged)
            self.pushButtonCancel.clicked.connect(Parametres.close)
     
            QMetaObject.connectSlotsByName(Parametres)
        # setupUi
     
        def retranslateUi(self, Parametres):
            Parametres.setWindowTitle(QCoreApplication.translate("Parametres", u"Param\u00e8tres de connexion", None))
            ...
     
        # retranslateUi
     
        def onButtonChanged(self):
            print("Super!!")
            #self.status_port.setText(QCoreApplication.translate("Parametres", "ok1", None))
            self.status_port.setText("New and Updated Text")
    Dans ce programme, la fenêtre s'affiche bien mais je n'arrive pas, en cliquant sur le "pushButtonConnect" à avoir le résultat escompté à l'appel de la méthode "onButtonChanged". Avant toutes mes modifications, le fichier d'origine utilisait un "QDialogButtonBox" qui ne fonctionnait pas aussi (enfin que je n'arrivais pas à ...). J'ai donc fais mes modifs persos et le bouton de fermeture fonctionne (50% de réussite.... encore que le programme n'est pas terminé.
    Quelqu'un aurait-il une idée pour résoudre ce problème?
    Si cela est nécessaire, je peux retourner le code complet (environ 400 lignes pour cette fenêtre modale).

    Merci beaucoup par avance

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

    Je vois que vous avez modifié le code issu du Designer: c'est une très mauvaise idée, parce que toute modification ultérieure avec Designer annulera ces modifications!

    C'est d'ailleurs clairement dit par le Designer dans l'entête du code généré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ## WARNING! All changes made in this file will be lost when recompiling UI file
    Il faut donc apprendre à travailler avec plusieurs fichiers pour un même programme:

    - le code généré par le Designer: moncode_ui.ui. C'est lui qu'on reprendra pour les modifications ultérieures (il y en a toujours!).

    - le code Python créé à partir du code précédent par l'exécution de "pyuic6 moncode_ui.ui -o moncode_ui.py" en console. On peut d'ailleurs créer un fichier avec ce code (.bat sous Windows) pour gagner du temps à chaque modif.

    - le code du programme lui-même qui exploitera moncode_ui.py en ajoutant tout ce qui manque.

    Voilà un petit exemple tout simple:

    1- le code créé par le Designer et converti par pyuic6:

    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
    # Form implementation generated from reading ui file 'moncode_ui.ui'
    #
    # Created by: PyQt6 UI code generator 6.4.2
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic6 is
    # run again.  Do not edit this file unless you know what you are doing.
     
     
    from PyQt6 import QtCore, QtGui, QtWidgets
     
     
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.resize(400, 300)
            self.pushButton = QtWidgets.QPushButton(parent=Form)
            self.pushButton.setGeometry(QtCore.QRect(120, 100, 141, 31))
            self.pushButton.setObjectName("pushButton")
     
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
     
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Form"))
            self.pushButton.setText(_translate("Form", "PushButton"))
    Et voilà le code du programme moncode.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
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt6 import QtWidgets
     
    from moncode_ui import Ui_Form
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        def __init__(self, parent=None):
            super().__init__(parent)
            self.ui = Ui_Form()
            self.ui.setupUi(self)
     
            self.ui.pushButton.clicked.connect(self.onPushButton)
     
        def onPushButton(self):
            print("Bonjour!") # affiche en console
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        fen = Fenetre()
        fen.show()
        sys.exit(app.exec())
    A l'exécution de ce code, la fenêtre QWidget apparait avec le bouton au milieu. Un clic sur le bouton affiche "Bonjour!" dans la console comme prévu.

    Un conseil supplémentaire: quand on bloque sur un gros programme avec un truc qui ne marche pas et qu'on ne comprend pas pourquoi, il est souvent intéressant de créer un exemple très simplifié (type moins de 50 lignes), et d'essayer jusqu'à ce que ça marche.
    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

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 3
    Points : 0
    Points
    0
    Par défaut
    Bonjour Tyrtamos,

    Je te remercie pour ce retour. Malgré ne pas avoir de réponse directe sur la problématique, je vais essayer avec une fenêtre plus simplifiée. Je clôture donc ce post.

    Bonne journée

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 708
    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 708
    Points : 31 007
    Points
    31 007
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par lacodav Voir le message
    dans laquelle j'ai certaines actions à réaliser avant de renvoyer certaines données. Pour le moment, je ne me suis pas penché sur la question du retour de ces données.
    Il y a plusieurs possibilités
    • tu peux émettre un signal à la fermeture de la fenêtre, le signal embarquant les données à renvoyer
    • tu peux stocker les données comme propriété de la fenêtre, propriétés pouvant être récupérées par n'importe quel widget connaissant la fenêtre


    Un exemple qui fait les deux
    Code python : 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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    #!/usr/bin/env python
    # coding: utf-8
     
    from PyQt6.QtCore import *
    from PyQt6.QtGui import *
    from PyQt6.QtWidgets import *
     
    # L'objet pour gérer mon appli
    class myAppli(QApplication):
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Environnement ihm
    		self.ihm={
    			"appli" : self,
    			"self" : self,
    			"mainWid" : None,
    		}
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# Le widget principal
    		self.ihm["mainWid"]=myMainWindow()
    	# __init__()
     
    	# Lancement boucle de traitement des évènements Qt
    	def exec(self):
    		# Affichage du widget principal
    		self.ihm["mainWid"].show()
     
    		# Appel méthode objet hérité
    		return super().exec()
    	# exec()
    # class myAppli
     
    # L'objet pour gérer ma fenêtre principale
    class myMainWindow(QMainWindow):
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Récupération environnement ihm appli
    		self.__ihm=QApplication.instance().ihm
    		self.__ihm["mainWid"]=self
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# La fenêtre sera détruite à sa fermeture
    		self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
     
    		# La zone centrale
    		self.setCentralWidget(QtGrappe(parent=self))
    	# __init__()
    # class myMainWindow
     
    # La grappe
    class QtGrappe(QWidget):
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Récupération environnement ihm appli
    		self.__ihm=QApplication.instance().ihm
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# La fenêtre sera détruite à sa fermeture
    		self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
     
    		# La saisie
    		self.__saisie=QtSaisie(parent=self, static=True)
    		self.__saisie.sigClose[dict].connect(self.__slotSaisie)
     
    		# Le bouton connecté à la fermeture des fenêtres de l'application
    		btn=QPushButton("Quit", parent=self, clicked=self.__ihm["mainWid"].close)
    		btn.setFont(QFont("Times", 18, QFont.Weight.Bold))
     
    		# Le bouton d'action
    		action=QPushButton("saisie", parent=self, clicked=self.__saisie.show)
    		action.setFont(QFont("Times", 18, QFont.Weight.Bold))
     
    		# Le gestionnaire de positionnement principal
    		mainLayout=QVBoxLayout(self)
    		mainLayout.addStretch(1)
    		mainLayout.addWidget(action, stretch=0)
    		mainLayout.addStretch(1)
    		mainLayout.addWidget(btn, stretch=0)
    	# __init__()
     
    	# Récupération valeurs saisies
            @pyqtSlot(dict)
    	def __slotSaisie(self, data):
    		print("data by signal=", data)
    		print("data by property=", self.__saisie.property("data"))
    # class QtGrappe
     
    # Zone de saisie
    class QtSaisie(QDialog):
    	# Le signal émis à la fermeture
    	sigClose=pyqtSignal(dict)
     
    	# Constructeur
    	def __init__(self, *args, **kwargs):
    		# Récupération environnement ihm appli
    		self.__ihm=QApplication.instance().ihm
     
    		# Récupérations paramètres spécifiques
    		static=kwargs.pop("static", True)
     
    		# Appel méthode objet hérité
    		super().__init__(*args, **kwargs)
     
    		# En cas de non statique, la fenêtre sera détruite à sa fermeture
    		if not static: self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
     
    		# La fenêtre est modale
    		self.setModal(True)
     
    		# La saisie
    		nomLabel=QLabel("nom", parent=self)
    		self.__nomEdit=QLineEdit(parent=self)
    		prenomLabel=QLabel("prenom", parent=self)
    		self.__prenomEdit=QLineEdit(parent=self)
    		adresseLabel=QLabel("adresse", parent=self)
    		self.__adresseEdit=QLineEdit(parent=self)
     
    		# Le gestionnaire de positionnement principal
    		mainLayout=QGridLayout(self)
    		mainLayout.addWidget(nomLabel, 0, 0, 1, 1)
    		mainLayout.addWidget(self.__nomEdit, 0, 1, 1, 1)
    		mainLayout.addWidget(prenomLabel, 1, 0, 1, 1)
    		mainLayout.addWidget(self.__prenomEdit, 1, 1, 1, 1)
    		mainLayout.addWidget(adresseLabel, 2, 0, 1, 1)
    		mainLayout.addWidget(self.__adresseEdit, 2, 1, 1, 1)
    		mainLayout.addWidget(
    			QPushButton("Ok", clicked=self.close),
    			3, 0, 1, 2,
    		)
    	# __init__()
     
    	# A l'ouverture de la fenêtre
    	def showEvent(self, e):
    		super().showEvent(e)
     
    		# Récupération des valeurs
    		if (data:=self.property("data")) is None: return
    		self.__nomEdit.setText(data["nom"])
    		self.__prenomEdit.setText(data["prenom"])
    		self.__adresseEdit.setText(data["adresse"])
    	# showEvent()
     
    	# A la fermeture de la fenêtre
    	def closeEvent(self, e):
    		# Sauvegarde des valeurs
    		data={
    			"nom" : self.__nomEdit.text().strip(),
    			"prenom" : self.__prenomEdit.text().strip(),
    			"adresse" : self.__adresseEdit.text().strip(),
    		}
    		self.setProperty("data", data)
     
    		# Emission du signal de fermeture
    		self.sigClose[dict].emit(data)
     
    		# Méthode objet hérité
    		super().closeEvent(e)
    	# closeEvent()
    # class QtSaisie
     
    # Dans le cas d'une exécution directe du script
    if __name__ == "__main__":
    	# L'application principale Qt
    	import sys
    	sys.exit(myAppli(sys.argv).exec())
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. récupérer une info contenue dans une fenetre modale
    Par glouffy6 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/12/2008, 23h51
  2. Ouvrir un éditeur dans une fenêtre modale
    Par i-thom dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 27/08/2008, 12h13
  3. Réponses: 3
    Dernier message: 15/11/2006, 13h57
  4. Formulaire dans une fenêtre modale
    Par Amnesiak dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 14h25
  5. Supprimer la croix dans une fenêtre modale
    Par AnneOlga dans le forum C++Builder
    Réponses: 3
    Dernier message: 15/01/2004, 14h52

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