Pages: 1
- Sujet précédent - QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire - Sujet suivant
#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: 726
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: utf8
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: 726
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: 726
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
Pages: 1
- Sujet précédent - QGIS 2.14 / PyQt4: Deconnecter le bouton "OK" dans un formulaire - Sujet suivant