Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Thu 28 April 2016 11:47

Rouyer Cyril
Participant occasionnel
Date d'inscription: 27 Sep 2012
Messages: 24

QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Bonjour,

Je suis en pleine réalisation d'un formulaire pour QGis 2.14 à l'aide de Qt Designer et d'un fichier Python.
J'ai un souci dans ma "formOpen" pour deconnecter le SIGNAL "accepted()" de ma QDialogButtonBox et de son SLOT "accept()"

Je souhaiterai qu'avant qu'il valide mon formulaire, il verifie que certain champs soit bel et bien rempli et qu'il complète certaines QLineEdit.

Après une recherche sur le net, la solution présentée :

    # Disconnect the signal that QGIS has wired up for the dialog to the button box.
    buttonBox.accepted.disconnect(myDialog.accept)

    # Wire up our own signals.
    buttonBox.accepted.connect(validate)
    buttonBox.rejected.connect(myDialog.reject)

ne fonctionne pas.

J'ai tenté :

    QObject.disconnect (buttonBox, SIGNAL("accepted()"), dialog, SLOT("accept()"))

Mais pas plus de résultat.

Auriez vous une solution?
Merci

Hors ligne

 

#2 Thu 28 April 2016 16:41

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

Re: QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Bonjour,
Pouvez-vous poster l ensemble de votre code ?
Le problème peut venir d une mauvaise déclaration de variable. Les codes fournis semblent bons.
Cordialement,

Hors ligne

 

#3 Thu 28 April 2016 16:57

Rouyer Cyril
Participant occasionnel
Date d'inscription: 27 Sep 2012
Messages: 24

Re: QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Merci de vous pencher dessus. Voici la partie de mon code qui me fait défaut :

#coding: utf­8

from PyQt4.QtCore import * 
from PyQt4.QtGui import *
from qgis.core import *


   
def formOpen(dialog,layerid,featureid):

   
    # 1.Definition des widgets QT
   
        # Bouton Valider

    global myDialog
    myDialog = dialog.findChild(QDialog,"myDialog")
    global valid
    valid = dialog.findChild(QPushButton,"Valider")       
    global edit
    edit = dialog.findChild(QPushButton,"Editer")
    global onglets
    onglets = dialog.findChild (QTabWidget, "Onglets")
    global boutonOk
    boutonOk = dialog.findChild (QDialogButtonBox, "Bouton_Ok")
   
    ...



       # Bouton Ok Annuler

   
    QObject.disconnect (boutonOk, SIGNAL("accepted()"), myDialog, SLOT("accept()"))
    QObject.connect (boutonOk, SIGNAL("accepted()"), fct_valider)

        # Bouton valider
       
    #QObject.connect(valid, SIGNAL("clicked()"), fct_valider)
    QObject.connect(edit, SIGNAL("clicked()"), fct_editer)


    ...

def fct_valider ():

    maCouche = qgis.utils.iface.activeLayer()

    fct_valid_3 ()
    fct_valid_4 ()
    fct_valid_7 ()
    fct_valid_8 ()
   

    proprio_no.setStyleSheet("background-color: rgba(255, 255, 255, 255);")
    rehab_dela.setStyleSheet ("background-color: rgba(255, 255, 255, 255);")
    if proprio_no.text()== "NULL" or proprio_no.text()== "":
        proprio_no.setStyleSheet("background-color: rgba(255, 107, 107, 150);")
        msgBox = QMessageBox()
        msgBox.setText("Le nom de proprietaire ne peut etre vide.\n Il se trouve dans l'onglet 'General'")
        msgBox.exec_()
       
    elif rehab_dela.text() == "NULL" or rehab_dela.text() == "" :
        rehab_dela.setStyleSheet ("background-color: rgba(255, 107, 107, 150);")
        msgBox = QMessageBox()
        msgBox.setText("Le delai de rehabilitation ne peut etre vide.\nIl se trouve dans l'onglet 'Controle ANC'")
        msgBox.exec_()
       
    else :
        msgBox = QMessageBox()
        msgBox.setText("Tout est bon.")
        msgBox.exec_()
        maCouche.commitChanges()
        myDialog.accept()
       
     
       

def fct_editer ():
    maCouche = qgis.utils.iface.activeLayer()
    if not maCouche.isEditable():
        maCouche.startEditing()
        valid.setEnabled (1)
       
    elif maCouche.isEditable():
        maCouche.commitChanges()
        valid.setEnabled (0)
           


Voilà.

Je suis également parti sur une autre piste, c'est à dire ne garder que l'option "cancel" de ma QDialogButtonBox et créer un QPushButton qui enverra la fct_valider.

Cela fonctionne jusqu'à la fermeture de mon QDialog mais le cadre de la fenetre reste ce qui m'oblige à utiliser la petite croix rouge et ainsi annuler les actions réaliser.

Merci d'avance.

CDT

Cyril

Hors ligne

 

#4 Thu 28 April 2016 20:58

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

Re: QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Bonsoir,

Quelques remarques en vrac :

concernant cette ligne-ci je suis sceptique :

Code:

myDialog = dialog.findChild(QDialog,"myDialog")

étant donné que dialog est en argument de la fonction que vous appelez

Code:

myDialog = dialog

doit suffire

Ensuite privilégier la nouvelle syntaxe

Code:

object.signal.connect(slot)

pour connecter ou déconnecter un signal d'un slot

ca donnera par exemple :

Code:

boutonOk.accepted.disconnect(dialog.accept)
boutonOk.accepted.connect(fct_valider)

Sinon à part ce je ne vois pas d'erreur flagrante, je n'ai pas le temps de tester ce soir, mais j'aurais p-e un plus de temps ce week-end.

La première des choses pour débugger est de tout enlever, juste charger l'interface et essayer de déconnecter le signal.

Cordialement,

Hors ligne

 

#5 Fri 29 April 2016 09:06

Rouyer Cyril
Participant occasionnel
Date d'inscription: 27 Sep 2012
Messages: 24

Re: QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Merci pour ces précisions, je vais m'atteler au modif.

Question subsidiaire : avant de fermer mon formulaire, celui-ci verifie que certains champs sont bien remplis. S'ils ne le sont pas, un message apparait et le champs en question se colorie en rouge. Jusque là tout vas bien.

Je souhaiterai que quelque soit l'onglet du formulaire où on se trouve quand on valide, l'onglet comportant le champs non rempli apparaisse après le message.

Je pense qu'il y a quelquechose a faire avec le currentIndex de mon QTabWidget mais je ne trouve pas comment le mettre en forme.


En tout cas merci pour le bouton OK.

Hors ligne

 

#6 Fri 29 April 2016 09:49

Rouyer Cyril
Participant occasionnel
Date d'inscription: 27 Sep 2012
Messages: 24

Re: QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Aïe, j'ai parlé un peu vite.

alors si j'ai bien tout suivi le code :

boutonOk.accepted.connect(fct_valider)

fonctionne puis la fonction se réalise, par contre :

boutonOk.accepted.disconnect(dialog.accept)

ne fonctionne pas car dès que je valide le message d'erreur, le formulaire se ferme.

Hors ligne

 

#7 Fri 29 April 2016 18:23

JD
Moderateur
Date d'inscription: 8 Aug 2013
Messages: 722

Re: QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Bonsoir,

ca va etre compliqué de vous débogguer votre code à distance. En plus, QGis plante totalement chez moi sous virtualisation avec les fichiers .ui. Je vous conseille de mettre votre code sur pastebin ou autres pour que ce soit plus simple.

Pour revenir à votre question :

pour afficher l'onglet il faut effectivement utiliser la fonction setCurrentIndex.

Dans votre cas :

Code:

onglets.setCurrentIndex(n)

Si un de vos objets sur l'onglet 1  n'est pas bien rempli, pour basculer sur l'onglet faites :

Code:

onglets.setCurrentIndex(0)

Cordialement,

PS : Je verrai demain sur un autre pc

Hors ligne

 

#8 Sat 30 April 2016 13:00

Rouyer Cyril
Participant occasionnel
Date d'inscription: 27 Sep 2012
Messages: 24

Re: QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire

Bonjour,

J'ai solutionné mon premier problème de déconnexion du bouton OK.

Puisque j'ai pu connecté une fonction en plus au bouton OK avant qu'il ne ferme le formulaire c'est ce que j'ai fait. Et j'ai ajouter un QPushButton "Vérification" qui vérifie que le formulaire est bien rempli et qui conditionne le fait que le QDialogButtonBox soit grisé ou pas.

Je vais maintenant tenter la fonction setCurrentIndex.

Merci des infos.

Hors ligne

 

Pied de page des forums

Powered by FluxBB