Associer par programmation une couche à une interface utilisateur personnalisée à l'aide de PyQGIS?

9

Je sais qu'il est possible d'associer une couche à une interface utilisateur personnalisée pour modifier les attributs d'entité à l'aide de l'interface QGIS. Mais est-ce possible avec Python?

Ce lien montre comment obtenir le résultat manuellement . Mais je voudrais pouvoir créer des couches automatiquement et leur faire utiliser une interface utilisateur personnalisée sans avoir à redéfinir le fichier et la méthode de l'interface utilisateur à chaque fois.

Dan
la source
1
@Matthias Merci pour cela! En tant que développeur de plugins, cette fonctionnalité m'intéressait. Cependant, je note que RoadForm.py doit être situé dans le répertoire du projet. Est-il possible de définir une fonction init à partir d'un plugin?
NZ Farmer

Réponses:

17

Disposition du formulaire

Vous disposez des méthodes suivantes pour ce faire:

QgsVectorLayer.setEditForm ('/ path / to / your / ui / file') pour fournir un fichier d'interface utilisateur et QgsVectorLayer.setEditFormInit ('python.Function') pour fournir une méthode d'initialisation python

Donc, avoir un QgsVectorLayer vlce qui suit fera ce que vous recherchez

vl.setEditForm( '/home/me/uifile.ui' )
vl.setEditFormInit( 'RoadForm.formOpen' )

À partir de QGIS 2.0, vous aurez également:

QgsVectorLayer.setEditorLayout (QgsVectorLayer :: EditorLayout)

Fournir QgsVectorLayer.GeneratedLayout, QgsVectorLayer.TabLayoutou QgsVectorLayer.UiFileLayoutde préciser quel type de mise en page que vous voulez. Cela vous permet de spécifier le nouveau concepteur de glisser-déposer (TabLayout).

Disposition des widgets

Mise à jour: à partir de QGIS 2.4, il y aura de nouvelles méthodes ( QgsVectorLayer.setEditorWidgetV2 et setEditorWidgetV2Config ) pour changer un type de widget d'éditeur et sa configuration. La méthode décrite ici fonctionnera toujours mais est marquée comme obsolète.

Il existe un certain nombre de méthodes liées aux widgets spécifiques que vous souhaitez utiliser:

Utilisez QgsVectorLayer.setEditType (fieldIdx, editType) pour spécifier le type de modification que vous souhaitez utiliser pour le widget pour l'index de champ fieldIdx. EditType est l' un de ceux - ci .

Pour configurer davantage le comportement du widget, utilisez les méthodes suivantes (en fonction des options de configuration de widget disponibles bien sûr):

Matthias Kuhn
la source
Bonjour Matthias, Merci pour cette réponse très complète. On dirait certainement que vous avez répondu à ma question et plus encore. Permettez-moi un peu de temps pour travailler sur les méthodes, et je vais attribuer la prime.
Dan
@Matthias Kuhn Est-il possible d'ajouter une liste de valeurs d'un csv à valueMap () avec QGIS 2.0 ou 2.2? Est-il également possible de mettre à jour par programme la liste avec les nouvelles valeurs ajoutées par l'utilisateur?
user25976
@Matthias Vous êtes l'un des développeurs de QGis, oui? Ces informations sont très utiles - elles devraient peut-être être ajoutées au livre de cuisine QGis ( docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook ). Actuellement, j'ai pris beaucoup de google pour trouver cette question et l'API n'a pas beaucoup aidé (en particulier la différence entre EditForm, EditorLayout, EditorWidgetV2).
Rauni
@Matthias Lorsque vous avez dit "La méthode décrite ici fonctionnera toujours mais est marquée comme obsolète", avez-vous fait référence à la méthode setEditorLayout ou aux méthodes setEditForm + setEditFormInit?
Rauni
@Rauni Merci pour la contribution avec le livre de recettes. setEditForm, setEditFormInitEt setEditorLayoutne sont pas dépréciée. Seules les méthodes liées widget ( setEditType, valueMap, widgetSizeetc.) à l' exception setFieldEditableet setLabelOnTop.
Matthias Kuhn