Pages: 1
- Sujet précédent - QGIS/PyQgis: Comment avoir la main en même temps que le script ? - Sujet suivant
#1 Thu 06 December 2018 16:16
- Yazaki
- Juste Inscrit !
- Date d'inscription: 26 Jun 2018
- Messages: 7
QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Bonjour à tous,
Je commence à coder en pyQgis.
Je voudrais savoir s'il est possible d'avoir le main sur Qgis en même temps que le script pyQgis s'exécute (et attends ma réponse via une boîte de dialogue).
Pour vous expliquer mon projet, dans la console Python je sélectionne certaines entités, je zoom dessus, puis je demande à l'utilisateur (via une boîte de dialogue) de rentrer 1, 2 ou 3.
Or, pour faire ce choix, avoir la main sur Qgis serait très appréciable ^^
J'ai fait beaucoup de recherche sur QInputDialog.getInt notamment sans succès.
Est ce possible d'après vous ? Merci, Yazaki
Dernière modification par Yazaki (Thu 06 December 2018 16:17)
Hors ligne
#2 Thu 06 December 2018 17:32
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Il faut créer votre Qdialog de façon non modal.
Voir ma réponse sur GIS SE sur le même genre de question :
https://gis.stackexchange.com/questions … 322#303322
Hors ligne
#3 Fri 07 December 2018 10:21
- Yazaki
- Juste Inscrit !
- Date d'inscription: 26 Jun 2018
- Messages: 7
Re: QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Merci YoLecompte
Le code que tu as mis fonctionne bien mais sais tu s'il existe un moyen d'exporter le valeur demandée par ton code ? (J'ai essayé avec my_dialog[0] ; my_dialog.result() sans succès.
Car en adaptant ton code avec la demande d'un entier, le zoom dans la fenêtre ne fonctionne pas (je crois que je fais mal la manipulation, voici mon code:)
Code:
from PyQt4.QtGui import QInputDialog my_dialog = QInputDialog.getInt(iface.mainWindow(), "Qualification" ,"Summer(1)/Winter(2)/Spring(3)/Other(0) : ",0,0,3) my_dialog.setModal(False) # so we keep UI alive and accessible my_dialog.show()
Merci,
Yazaki
Dernière modification par Yazaki (Fri 07 December 2018 11:31)
Hors ligne
#4 Fri 07 December 2018 12:33
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Si tu utilises getInt pour instancier ton dialog, il ne pourra pas être non modal car il va attendre la valeur de retour pour te rendre la main et tu vas la stocker dans ta variable my_dialog. Dans ton code la ligne my_dialog.setModal renvois une erreur puisque my_dialog est le résultat de la saisie (un tuple en l'occurence) et n'a pas de méthode setModal. La méthode setModal est utilisable sur un objet QDialog.
A partir du moment où la fenêtre n'est plus modal, tu ne maîtrise plus le moment où l'utilisateur va cliquer sur OK.
Il faut donc que tu connectes le signal d'acceptation de ta fenêtre à une fonction qui récupérera la valeur au moment où l'utilisateur clique sur Ok.
Voila un exemple fonctionnel:
Code:
from PyQt4.QtGui import QInputDialog def getResult(dlg): ret = dlg.textValue() print ret my_dialog = QInputDialog(iface.mainWindow()) my_dialog.setModal(False) # so we keep UI alive and accessible my_dialog.accepted.connect(lambda: getResult(my_dialog)) my_dialog.show()
Dernière modification par YoLecomte (Fri 07 December 2018 13:45)
Hors ligne
#5 Fri 07 December 2018 15:34
- Yazaki
- Juste Inscrit !
- Date d'inscription: 26 Jun 2018
- Messages: 7
Re: QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Salut YoLecomte,
Merci pour ta réponse claire et rapide. Je comprends beaucoup mieux comment cela fonctionne.
Dans le cadre de mon projet, une fenêtre modal est indispensable. J'utilise donc le signal d'acceptation qui marche très bien pour une utilisation. Par contre, si je veux l'appeler plusieurs fois lors d'une boucle par exemple, cela se corse un peu.
Mon premier essai a été de mettre tes lignes de codes dans une boucle for comme suit :
Code:
for i in range(2): # par exemple vouloir rentrer 2 instances my_dialog = QInputDialog(iface.mainWindow()) my_dialog.setModal(False) # so we keep UI alive and accessible my_dialog.accepted.connect(lambda: getResult(my_dialog)) my_dialog.show()
Comme tu l'as dit, la fonction attend que l'utilisateur clique sur Ok (c'est pourquoi les 2 fenêtres s'ouvrent une à la suite de l'autre).
Du coup, j'ai pensé à créer une boucle while afin d'attendre que l'utilisateur clique sur ok avant de reprendre la boucle for comme suit :
Code:
for i in range(2): # par exemple vouloir rentrer 2 instances my_dialog = QInputDialog(iface.mainWindow()) my_dialog.setModal(False) # so we keep UI alive and accessible my_dialog.accepted.connect(lambda: getResult(my_dialog)) my_dialog.show() while(getResult(my_dialog)==None): # boucle while permettant d'attendre que l'utilisateur rentre quelque chose res = getResult(my_dialog)
Le soucis est que cela me crée une boucle infini car getResult(my_dialog) a une valeur dès l'instant où l'utilisateur rentre une valeur sans pour autant attendre qu'il ait mit ok ^^
Connais-tu une fonction permettant d'attendre le click ou une autre idée ?
Désolée pour toutes ces questions, j'ai regardé un peu partout sur les forums, la documentation de Qt sans trouver toutes les méthodes existantes pour QInputDialog.
Merci,
Yazaki
Hors ligne
#6 Fri 07 December 2018 16:01
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Tu peux recréer un nouveau dialog apres avoir recuperer la valeur et à chaque fois que l'utilisateur clique sur OK. Le système s'arrete lorsque l'utilisateur ferme la fenetre ou click sur annuler.
Voila un script a faire tourner dans la console python de QGIS
Code:
# coding : utf-8 from PyQt4.QtGui import QInputDialog def getResult(dlg): """Fonction exécutée lorsque le Qdialog associé est validé""" ret = dlg.textValue() # ici, on fait quelque chose avec le resultat create_dialog() # et on recommence def create_dialog(): """Crée un QInputDialog connecter à une fonction lors de l'acceptation""" my_dialog = QInputDialog(iface.mainWindow()) my_dialog.setModal(False) # so we keep UI alive and accessible my_dialog.accepted.connect(lambda: getResult(my_dialog)) my_dialog.show() create_dialog() # on ouvre la fenêtre une première fois
Dernière modification par YoLecomte (Fri 07 December 2018 16:07)
Hors ligne
#7 Fri 07 December 2018 16:04
- Yazaki
- Juste Inscrit !
- Date d'inscription: 26 Jun 2018
- Messages: 7
Re: QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Whaouh super Merci beaucoup !!
Ton aide m'a été très précieuse merci YoLecomte !
Yazaki
Hors ligne
#8 Fri 07 December 2018 16:09
- YoLecomte
- Participant assidu
- Lieu: Epinal
- Date d'inscription: 7 Jul 2015
- Messages: 266
Re: QGIS/PyQgis: Comment avoir la main en même temps que le script ?
Mais de rien
Hors ligne
Pages: 1
- Sujet précédent - QGIS/PyQgis: Comment avoir la main en même temps que le script ? - Sujet suivant