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 :

Fermer des fenêtres


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut Fermer des fenêtres
    Bonjour,

    Je suis sous python 2,7 et pyQt4. Je devellope un pulgin qui possède plusieurs fenêtres. Mon problème est que une fois les fenêtre ouvertent, je n'arrive pas à les faires se fermer automatiquement lors de evenement de type clique sur un bouton ou double clique sur un widget. Je n'ai surement pas bien saisie le principe du self.close(), ni du closeEvent.

    Quelqu'un pourrait t'il m'éclairer sur ce sujet ?

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut, je suppose que tes fenêtres sont des QDialog.

    Le fenêtres de dialogue peuvent être fermées de différentes façons.

    QDialog.reject() >> ferme la fenêtre et retourne 0
    QDialog.accept() >> ferme la fenêtre et retourne 1
    QDialog.done(int) >> ferme la fenêtre et retourne l'entier en argument
    click sur la croix de fermeture >> ferme la fenêtre et retourne 0 sous Linux

    Donc, imaginons un dialogue demandant à l'utilisateur de choisir entre une option par défaut, une option personnalisée ou un abandon de l'opération avec:
    un bouton OK > option par défaut
    un bouton Custom > option personnalisée (par exemple "5")
    un bouton Cancel > annulation de l'opération

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    def on_button_ok_clicked(self):
        self.accept()
    def on_button_custom_clicked(self):
        self.done(5)
    def on_button_cancel_clicked(self):
        self.reject()
    Cela répond-t-il à la question ?

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    Mes fenêtres sont bien des QDialog crée via QDesigner (Dialog without Buttons). Question comment le savoir via le code ? J'ai réussi à faire fermer ma fenêtre via cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("doubleClicked(QModelIndex)")), uiSrid.close)
    J'ai essayé avec un QDialog.accept(), en créant une nouvelle fonction comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("doubleClicked(QModelIndex)")),self.doubleClick)
     
        def doubleClick (self):
            self.accept()
    Mais j'ai ce message : ´AttributeError: 'Ui_uiSrid' object has no attribute 'accept'
    Ma class étant défini comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Ui_uiSrid(QtGui.QMainWindow):

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Ben non, seul le QDialog a une méthode accept().

    Si tu crées un dialogue avec Qt Designer et que tu ne veux pas toucher au code tu peux malgrès tout connecter le signal lors de l'instanciation du dialogue. Mais pas de la façon dont tu le fais.

    De quelle manière veux-tu que le dialogue soit fermé par l'utilisateur ? click sur un bouton ? suite à une action quelconque sur un widget du dialogue ?

    L'histoire du double-click dans un QTableWidget, je la sens pas bien par contre. Ta QTableWidget est bien dans le QDialog, on est bien d'accord ?

    Comment le QDialog est-il appelé ? dans une fonction ?

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 98
    Par défaut
    De quelle manière veux-tu que le dialogue soit fermé par l'utilisateur ?
    Le sénario que j'aimerais est le suivant :
    1.L'utilisateur ouvre la fenêtre2 (avec le QtableWidget) en cliquant sur un bouton de la fenetre1
    2.Il selectionne une ligne du tableau en doucle cliquant dessus
    3.L'appli récupère la selection
    4.L'appli ferme automatiquement la fenetre après le double clique
    5.La selection est afficher dans la fenetre2 dans un QlineEdit

    Les points 1,2 et 3 sont ok, le point 4 est pas super optimal d'où mon message et le 5 est en court car j'ai des soucies de passage d'argument entre mes classes.

    Comment le QDialog est-il appelé ? dans une fonction ?
    Le QDialogue est appelé lorsque je clique sur le bouton via une méthode (uiSrid cf code)

    Pour aide mon code :
    fenêtre 1 :
    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
    class Ui_Download(QtGui.QMainWindow):
     
        def setupUi(self, Ui_Download, Main):
            Ui_Download.setObjectName(_fromUtf8("Ui_Download"))
            Ui_Download.resize(651, 251)
            self.gridLayoutWidget = QtGui.QWidget(Ui_Download)
            self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 10, 631, 231))
            self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
            self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
            self.gridLayout.setMargin(0)
            self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
            self.label_titre = QtGui.QLabel(self.gridLayoutWidget)
            font = QtGui.QFont()
            font.setFamily(_fromUtf8("Calibri"))
            font.setPointSize(12)
            font.setBold(True)
            font.setWeight(75)
            self.label_titre.setFont(font)
            self.label_titre.setObjectName(_fromUtf8("label_titre"))
            self.gridLayout.addWidget(self.label_titre, 0, 0, 1, 1)
            self.lineEdit_srid = QtGui.QLineEdit(self.gridLayoutWidget)
            self.lineEdit_srid.setObjectName(_fromUtf8("lineEdit_srid"))
            self.gridLayout.addWidget(self.lineEdit_srid, 4, 1, 1, 1)
            self.pushButton_Browse = QtGui.QPushButton(self.gridLayoutWidget)
            self.pushButton_Browse.setObjectName(_fromUtf8("pushButton_Browse"))
            self.gridLayout.addWidget(self.pushButton_Browse, 2, 0, 1, 1)
            self.pushButton_srid = QtGui.QPushButton(self.gridLayoutWidget)
            self.pushButton_srid.setObjectName(_fromUtf8("pushButton_srid"))
            self.gridLayout.addWidget(self.pushButton_srid, 4, 0, 1, 1)
            self.pushButton_Import = QtGui.QPushButton(self.gridLayoutWidget)
            self.pushButton_Import.setObjectName(_fromUtf8("pushButton_Import"))
            self.gridLayout.addWidget(self.pushButton_Import, 6, 1, 1, 1)
            self.lineEdit_pathfile = QtGui.QLineEdit(self.gridLayoutWidget)
            self.lineEdit_pathfile.setObjectName(_fromUtf8("lineEdit_pathfile"))
            self.gridLayout.addWidget(self.lineEdit_pathfile, 2, 1, 1, 1)
            self.label_file = QtGui.QLabel(self.gridLayoutWidget)
            self.label_file.setObjectName(_fromUtf8("label_file"))
            self.gridLayout.addWidget(self.label_file, 1, 0, 1, 1)
            self.label_srid = QtGui.QLabel(self.gridLayoutWidget)
            self.label_srid.setObjectName(_fromUtf8("label_srid"))
            self.gridLayout.addWidget(self.label_srid, 3, 0, 1, 1)
            spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
            self.gridLayout.addItem(spacerItem, 5, 1, 1, 1)
            spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
            self.gridLayout.addItem(spacerItem1, 0, 1, 1, 1)
     
            self.retranslateUi(Ui_Download)
            QtCore.QObject.connect(self.pushButton_Browse, QtCore.SIGNAL(_fromUtf8("clicked()")), Ui_Download.open)
            QtCore.QObject.connect(self.pushButton_srid, QtCore.SIGNAL(_fromUtf8("clicked()")), Ui_Download.open)
            QtCore.QObject.connect(self.pushButton_Import, QtCore.SIGNAL(_fromUtf8("clicked()")), Ui_Download.open)
            QtCore.QMetaObject.connectSlotsByName(Ui_Download)
     
            self.pushButton_Browse.clicked.connect(self.browseDialog)
            self.pushButton_srid.clicked.connect(self.uiSrid)
            self.pushButton_Import.clicked.connect(self.uiLoad)
            #self.lineEdit_srid.textEdited.connect(self.srid)# Code directement entré par l'utilisateur
     
        def retranslateUi(self,Ui_Download):
            Ui_Download.setWindowTitle(_translate("Ui_Download", "Ui_Download", None))
            self.label_titre.setText(_translate("Ui_Download", "Data Download", None))
            self.pushButton_Browse.setText(_translate("Ui_Download", "Browse", None))
            self.pushButton_srid.setText(_translate("Ui_Download", "SRID", None))
            self.pushButton_Import.setText(_translate("Ui_Download", "Import", None))
            self.label_file.setText(_translate("Ui_Download", "Chose a file to import :", None))
            self.label_srid.setText(_translate("Ui_Download", "Chose a srid :", None))
     
        def browseDialog(self, Ui_Download):
            """Selection du fichier et affichage du chemin d'accès"""
            pathfile = QtGui.QFileDialog.getOpenFileName(self, 'Open file', '/home')
            correctedpathfile= pathfile.replace('\\', '/') #Version du chemin pour les requêtes postgresql
            self.lineEdit_pathfile.setText(str(correctedpathfile))
     
     
        def uiSrid(self):
            """Ouvre la fentre de selection du code srid """
            self.windowSRID= QtGui.QDialog()
            self.windowSRID.setWindowModality(QtCore.Qt.ApplicationModal)
            self.uisrid = ui_srid.Ui_uiSrid()
            self.uisrid.setupUi(self.windowSRID, self)    
            self.windowSRID.exec_()
     
        def srid(self,srid_return) :
            """Remplis le srid dans la base de donner"""
            self.lineEdit_srid.setText(srid_emit)
    fenêtre 2 :
    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
    class Ui_uiSrid(QtGui.QMainWindow):
     
        signal_srid = pyqtSignal(str)
     
     
        def setupUi(self, uiSrid,Main):
            uiSrid.setObjectName(_fromUtf8("uiSrid"))
            uiSrid.setWindowModality(QtCore.Qt.WindowModal)
            uiSrid.resize(781, 427)
            self.gridLayoutWidget = QtGui.QWidget(uiSrid)
            self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 30, 761, 371))
            self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
            self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
            self.gridLayout.setMargin(0)
            self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
            self.tableWidget = QtGui.QTableWidget(self.gridLayoutWidget)
            self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
            self.tableWidget.setColumnCount(0)
            self.tableWidget.setRowCount(0)
            self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
     
            self.retranslateUi(uiSrid)
            QtCore.QMetaObject.connectSlotsByName(uiSrid)
     
            self.tableWidget.cellDoubleClicked.connect(self.returnSRID) 
            self.sridData() # Rempli la table
     
            QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("doubleClicked(QModelIndex)")), uiSrid.close)
     
    #Test fermeture
            #QtCore.QObject.connect(self.tableWidget, QtCore.SIGNAL(_fromUtf8("doubleClicked(QModelIndex)")),self.doubleClick)
        #def doubleClick (self):   
            #self.accept()
     
     
        def retranslateUi(self, uiSrid):
            uiSrid.setWindowTitle(_translate("uiSrid", "Dialog", None))
     
        def sridData(self): ##REMPLISSAGE
            try:
                conn = psycopg2.connect("dbname='postgis_21_sample' user='postgres' host='localhost' password='postgresql'")
            except:
                print "I am unable to connect to the database"
            cur = conn.cursor()        
            self.data= cur.execute("SELECT srtext, srid_text FROM spatial_ref_sys;")
            data = cur.fetchall()             
            lignes = len(data)
            columns =  len(data[0])
            i = 0
            j = 0
            self.tableWidget.setRowCount(lignes)
            self.tableWidget.setColumnCount(columns)
            self.tableWidget.setHorizontalHeaderLabels(['Label sird', 'srid'])
            self.tableWidget.horizontalHeader().setResizeMode(0, QtGui.QHeaderView.Stretch)
     
            for i in range(lignes):
                for j in range(columns):
                    item = QtGui.QTableWidgetItem(data[i][j])
                    self.tabledata = self.tableWidget.setItem(i, j, item)
     
        def returnSRID(self,row,column): # Apellé seulemment lorsque l'on selection une ligne
            Row = self.tableWidget.currentRow()
            currentCol=self.tableWidget.currentColumn()
            if currentCol ==0 :
                Col = currentCol +1
            else:
                Col = currentCol
            srid_emit =self.tableWidget.item(Row,Col).text() # code srid à envoyer à ui_download
     
            #Passage de srid_emit
            uiDownload = ui_download.Ui_Download()
            self.signal_srid.connect(uiDownload.setupUi(srid_emit))
            self.signal_srid.emit(srid_emit)

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Elle m'ont l'air spéciales tes classes, on dirait du code produit par pyuic4 et modifié par tes soins.

    Ceci n'est pas normal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Ui_Download(QtGui.QMainWindow):
     
        def setupUi(self, Ui_Download, Main):
    Soit tu instancies ta main window comme ceci:
    Façon pyuic4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        MainWindow = QtGui.QMainWindow()
        self.ui = Ui_Download()
        self.ui.setupUi(MainWindow, self)
        self.ui.show()
    Dans ce cas, ta classe doit être déclarée comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Ui_Download(objet):
     
        def setupUi(self, MainWindow, Main):
            # Et tu remplace Ui_Download par MainWindow partout dans la suite du code
    Soit tu l'instancies comme ceci:
    Facon pythonique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        self.ui = Ui_Download(self)
        self.ui.show()
    Dans ce cas, ta classe doit être déclarée comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Ui_Download(QtGui.QMainWindow):
     
        def __init__(self, Main):
            super(Ui_Download, self).__init__()
            # Et tu remplace Ui_Download par self partout dans la suite du code
    Tu choisis une méthode mais pas un mélange des deux, les erreurs qui pourraient en découler seront très difficiles à comprendre.

    Pareil pour la boîte de dialogue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class Ui_uiSrid(QtGui.QMainWindow):
        signal_srid = pyqtSignal(str)
        def setupUi(self, uiSrid,Main):
    Pourquoi QMainWindow ? Alors que tu la déclares d'abord comme QDialog, si cela ne déclenche pas d'erreur c'est parce que dans ce code QMainWindow n'est pas instancié. Et donc, ne sert à rien.

    Même chose que pour la main window
    Façon pyuic4
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        def uiSrid(self):
            """Ouvre la fentre de selection du code srid """
            self.windowSRID= QtGui.QDialog()
            self.windowSRID.setWindowModality(QtCore.Qt.ApplicationModal)
            self.uisrid = ui_srid.Ui_uiSrid()
            self.uisrid.setupUi(self.windowSRID, self)    
            self.windowSRID.exec_()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Ui_uiSrid(QtCore.QObject):
        # Il faut utiliser QtCore.QObject pour pyqtSignal
        signal_srid = pyqtSignal(str)
        def setupUi(self, uiSrid, Main):

    Facon pythonique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        def uiSrid(self):
            """Ouvre la fentre de selection du code srid """
            self.uisrid = ui_srid.Ui_uiSrid(self)
            self.uisrid.setWindowModality(QtCore.Qt.ApplicationModal)   
            self.uisrid.exec_()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Ui_uiSrid(QtCore.Dialog):
        signal_srid = pyqtSignal(str)
        def __init__(self, Main):
            super(Ui_uiSrid, self).__init__()
            # Et tu remplace uiSrid par self partout dans la suite du code
    Pour fermer le dialogue maintenant.
    Je considère la méthode dite pythonique, mais ce sera pareil pour l'autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        def uiSrid(self):
            """Ouvre la fenêtre de selection du code srid """
            self.uisrid = ui_srid.Ui_uiSrid(self)
            self.uisrid.setWindowModality(QtCore.Qt.ApplicationModal)
            self.uisrid.signal_srid.connect(self.lineEdit_srid.setText)
            self.uisrid.exec_()
    Et tu supprimes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        def srid(self,srid_return) :
            """Remplis le srid dans la base de donner"""
            self.lineEdit_srid.setText(srid_emit)
    qui ne sert plus à rien.
    Le dialogue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            # Ça c'est OK
            self.tableWidget.cellDoubleClicked.connect(self.returnSRID)
     
        def returnSRID(self, row, column):
            if column == 0:
                column = 1
            self.signal_srid.emit(self.tableWidget.item(row, column).text())
            self.accept()
            # et tu effaces le reste bien sur

Discussions similaires

  1. Fermer et ouvrir des fenètres sous Eclipse
    Par JeanNoel53 dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 12/05/2015, 07h48
  2. [AC-2007] [VBA] Fermer la fenêtre des propriétés
    Par mcdotta dans le forum VBA Access
    Réponses: 3
    Dernier message: 26/04/2010, 09h57
  3. Fermer la fenêtre des préférences sans cliquer sur le bouton Cancel
    Par Laurent.B dans le forum Eclipse Platform
    Réponses: 7
    Dernier message: 22/01/2010, 22h12
  4. Fermer la fenêtre des propriétés ?
    Par electrosat03 dans le forum Access
    Réponses: 4
    Dernier message: 01/03/2007, 16h01
  5. Réponses: 5
    Dernier message: 04/01/2007, 14h32

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