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 Mon 05 January 2015 16:52

Cedricc
Participant actif
Date d'inscription: 22 Apr 2010
Messages: 105

QGIS : Liste de valeurs

Bonjour à tous,

Lorsque l'on remplit un champ on peut lui attribuer une liste de valeurs prédéfinies, ma question est simple : peut-on créer des listes de valeurs imbriquées (liste de valeurs dépendante d'un premier choix) ?

Hors ligne

 

#2 Tue 06 January 2015 09:44

haubourg
Participant assidu
Lieu: Grenoble
Date d'inscription: 7 Sep 2005
Messages: 257
Site web

Re: QGIS : Liste de valeurs

Bonjour,
c'est possible, en ajoutant des comportements python associés au formulaire. Je n'ai pas d'exemple à fournir.
Bonne journée
Régis

Hors ligne

 

#3 Tue 06 January 2015 09:58

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1222
Site web

Re: QGIS : Liste de valeurs

Bonjour Cedricc,

cela n'est pas possible à ma connaissance avec les formulaires simples de QGis.

Mais ça doit pouvoir se faire avec les formulaires personnalisés et un peu de python...

une question semblable ici : http://hub.qgis.org/issues/11264
l'Auteur a peut-être avancé sur le sujet.

[EDIT]Régis a été plus rapide :-)[/EDIT]


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#4 Wed 07 January 2015 16:33

Cedricc
Participant actif
Date d'inscription: 22 Apr 2010
Messages: 105

Re: QGIS : Liste de valeurs

Ok merci à tous les deux, je vois ce qu'il me reste à faire. Etant un utilisateur Mapbasic, j'ai trouvé un prétexte pour me lancer dans Python !

Hors ligne

 

#5 Mon 12 January 2015 09:41

Cedricc
Participant actif
Date d'inscription: 22 Apr 2010
Messages: 105

Re: QGIS : Liste de valeurs

Quand tu parles d'ajouter comportements python associés au formulaire, j'imagine que ce n'est pas sous forme de plugin... je me demande quelle forme ça prend, j'avoue être un peu perdu.

Hors ligne

 

#6 Mon 12 January 2015 11:27

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: QGIS : Liste de valeurs

Bonjour,
Oui, il ne s'agit pas d'un plugin mais d'associer du code à ton formulaire et qui va se charger d'en analyser le comportement et réagir en conséquence. Est-ce que ce lien ou celui-ci (sur des versions antérieures de QGIS mais bon...) apporte un début de réponse?
Ce dernier me semble assez proche du comportement attendu (au lieu d'avoir une valeur directement renseignée, récupérer une sous-liste).

Hors ligne

 

#7 Mon 12 January 2015 12:43

haubourg
Participant assidu
Lieu: Grenoble
Date d'inscription: 7 Sep 2005
Messages: 257
Site web

Re: QGIS : Liste de valeurs

SANTANNA a écrit:

Bonjour,
Oui, il ne s'agit pas d'un plugin mais d'associer du code à ton formulaire et qui va se charger d'en analyser le comportement et réagir en conséquence. Est-ce que ce lien ou celui-ci (sur des versions antérieures de QGIS mais bon...) apporte un début de réponse?
Ce dernier me semble assez proche du comportement attendu (au lieu d'avoir une valeur directement renseignée, récupérer une sous-liste).


Pas mieux que Santanna pour les liens. Voici un exemple de code interne pour un formulaire chez nous (avec sous formulaire). Les comportements ajoutés permettent de ne pas avoir à basculer la couche en édition pour faire une modification de formulaire, et de sauvegarder les résultats sur click OK ou APPLIQUER (ne ferme pas le formulaire).

Code:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import QgsMapLayerRegistry
from qgis.core import QgsMessageLog
from qgis.gui import QgsMessageBar

import qgis.utils

def formOpen(dialog,layer,feature):
    QgsMessageLog.logMessage("formOpen", 'Extensions')
    registry = QgsMapLayerRegistry.instance()

    layerOuv = registry.mapLayer("v_ouvrage_pdom20141016111125407")
    layer.startEditing()
    layerOuv.startEditing()
       
    # Disconnect the signal that QGIS has wired up for the dialog to the button box.
    #nameField = dialog.findChild(QLineEdit,"Name")
    buttonBox = dialog.findChild(QDialogButtonBox,"buttonBox")
    buttonBox.accepted.disconnect(dialog.accept)
 
    textEdit = dialog.findChild(QTextEdit,"context_html")
    textEdit.textInteractionFlags = Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard | Qt.LinksAccessibleByMouse
 
    # Wire up our own signals.
    buttonBox.accepted.connect(lambda:validate(dialog, layer, layerOuv))
    buttonBox.rejected.connect(lambda:reject(dialog, layer, layerOuv))
    # cas du bouton "Appliquer" : faire circuler l'instance du bouton, mais aussi les parametres additionnels
    buttonBox.clicked.connect(lambda button:clicked(button, dialog, layer, layerOuv))
  
    f = dialog.findChild(QTextEdit, "pdom_tsec_pire_class_prop_comment")
    f.setModified()

    f = dialog.findChild(QTextEdit, "connaiss_prop_comment")
    f.setModified()
        
    f = dialog.findChild(QTextEdit, "context_html")
    f.setModified()
          
def validate(dialog, layer, layerOuv):
    QgsMessageLog.logMessage("validate", 'Extensions')   
    dialog.accept()    
    
    # Si le commit n'est pas passe, en informer l'utilisateur
    if not layerOuv.commitChanges():
        qgis.utils.iface.messageBar().pushMessage("Error", "Erreur non determinee lors de la sauvegarde.", level=QgsMessageBar.CRITICAL)

    # Si le commit n'est pas passe, en informer l'utilisateur
    if not layer.commitChanges():
        qgis.utils.iface.messageBar().pushMessage("Error", "Erreur non determinee lors de la sauvegarde.", level=QgsMessageBar.CRITICAL)

def reject(dialog, layer, layerOuv):
    QgsMessageLog.logMessage("reject", 'Extensions')
    dialog.reject()
    layer.rollBack() 
    layerOuv.rollBack() 

def clicked(button, dialog, layer, layerOuv):
    QgsMessageLog.logMessage("clicked : "+str(button.text()), 'Extensions')   
    if str(button.text()) == 'Appliquer':
        dialog.accept()    
        
        QgsMessageLog.logMessage("Appliquer", 'Extensions')   
        # Si le commit n'est pas passe, en informer l'utilisateur (reste en edition)
        if not layerOuv.commitChanges():
            qgis.utils.iface.messageBar().pushMessage("Error", "Erreur non determinee lors de la sauvegarde.", level=QgsMessageBar.CRITICAL)
        # sinon, passer a nouveau en edition
        else:
            layerOuv.startEditing() 
        
        # Si le commit n'est pas passe, en informer l'utilisateur (reste en edition)
        if not layer.commitChanges():
            QgsMessageLog.logMessage("Commit Ko", 'Extensions')   
            qgis.utils.iface.messageBar().pushMessage("Error", "Erreur non determinee lors de la sauvegarde.", level=QgsMessageBar.CRITICAL)
        # sinon, passer a nouveau en edition
        else:
            QgsMessageLog.logMessage("Commit ok ?", 'Extensions')   
            layer.startEditing() 

# cas du formulaire S.A. seul    
def formOpenOuv(dialog,layer,feature):
    QgsMessageLog.logMessage("formOpenOuv", 'Extensions')
    registry = QgsMapLayerRegistry.instance()

    layer.startEditing()
       
    # Disconnect the signal that QGIS has wired up for the dialog to the button box.
    #nameField = dialog.findChild(QLineEdit,"Name")
    buttonBox = dialog.findChild(QDialogButtonBox,"buttonBox")
    buttonBox.accepted.disconnect(dialog.accept)
 
    # Wire up our own signals.
    buttonBox.accepted.connect(lambda:validateOuv(dialog, layer))
    buttonBox.rejected.connect(lambda:rejectOuv(dialog, layer))
    # cas du bouton "Appliquer" : faire circuler l'instance du bouton, mais aussi les parametres additionnels
    buttonBox.clicked.connect(lambda button:clickedOuv(button, dialog, layer))
    
    f = dialog.findChild(QTextEdit, "action_prop_comment")
    f.setModified()

    f = dialog.findChild(QTextEdit, "context_html")
    f.setModified()
        
    f = dialog.findChild(QTextEdit, "eru_ctxt")
    f.setModified()
    
  
def validateOuv(dialog, layer):
    QgsMessageLog.logMessage("validateOuv", 'Extensions')   
    dialog.accept()    
    
    if not layer.commitChanges():
        qgis.utils.iface.messageBar().pushMessage("Error", "Erreur non determinee lors de la sauvegarde.", level=QgsMessageBar.CRITICAL)

def rejectOuv(dialog, layer):
    QgsMessageLog.logMessage("rejectOuv", 'Extensions')
    dialog.reject()
    layer.rollBack() 

def clickedOuv(button, dialog, layer):
    QgsMessageLog.logMessage("clicked : "+str(button.text()), 'Extensions')   
    if str(button.text()) == 'Appliquer':
        dialog.accept()    
        
        # Si le commit n'est pas passe, en informer l'utilisateur (reste en edition)
        if not layer.commitChanges():
            qgis.utils.iface.messageBar().pushMessage("Error", "Erreur non determinee lors de la sauvegarde.", level=QgsMessageBar.CRITICAL)
        # sinon, passer a nouveau en edition
        else:
            layer.startEditing()

Hors ligne

 

#8 Mon 12 January 2015 17:28

Cedricc
Participant actif
Date d'inscription: 22 Apr 2010
Messages: 105

Re: QGIS : Liste de valeurs

Merci beaucoup pour ces pistes je vais regarder ça avec attention.

Hors ligne

 

Pied de page des forums

Powered by FluxBB