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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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 smile

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 !! smile
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 smile

Hors ligne

 

Pied de page des forums

Powered by FluxBB