#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
#3 Tue 06 January 2015 09:58
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: 3945
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).
En ligne
#7 Mon 12 January 2015 12:43
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).
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