¿Asociando programáticamente la capa con la IU personalizada usando PyQGIS?

9

Sé que es posible asociar una capa con una interfaz de usuario personalizada para editar atributos de características utilizando la interfaz QGIS. ¿Pero es esto posible con Python?

Este enlace muestra cómo lograr el resultado manualmente . Pero me gustaría poder crear capas automáticamente y hacer que usen una interfaz de usuario personalizada sin tener que redefinir el archivo y el método de interfaz de usuario cada vez.

Dan
fuente
1
@Matthias ¡Gracias por esto! Como desarrollador de complementos, estaba interesado en la función. Sin embargo, observo que RoadForm.py debe ubicarse en el directorio del Proyecto. ¿Es posible definir una función init desde un complemento?
NZ Farmer

Respuestas:

17

Diseño de formulario

Tiene los siguientes métodos para hacer esto:

QgsVectorLayer.setEditForm ('/ path / to / your / ui / file') para proporcionar un archivo UI y QgsVectorLayer.setEditFormInit ('python.Function') para proporcionar un método de inicio de Python

Entonces, tener un QgsVectorLayer vllo siguiente hará lo que está buscando

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

A partir de QGIS 2.0 también tendrá:

QgsVectorLayer.setEditorLayout (QgsVectorLayer :: EditorLayout)

Proporcionar QgsVectorLayer.GeneratedLayout, QgsVectorLayer.TabLayouto QgsVectorLayer.UiFileLayoutpara especificar qué tipo de diseño que desee. Esto le permite especificar el nuevo diseñador de arrastrar y soltar (TabLayout).

Diseño de widget

Actualización: a partir de QGIS 2.4 habrá nuevos métodos ( QgsVectorLayer.setEditorWidgetV2 y setEditorWidgetV2Config ) para cambiar un tipo de widget de editor y su configuración. El método descrito aquí seguirá funcionando pero está marcado como obsoleto.

Hay varios métodos relacionados con los widgets específicos que desea utilizar:

Use QgsVectorLayer.setEditType (fieldIdx, editType) para especificar el tipo de edición que desea usar para el widget para el índice de campo fieldIdx. editType es uno de estos .

Para configurar aún más el comportamiento del widget, utilice los siguientes métodos (dependiendo de las opciones de configuración del widget disponibles, por supuesto):

Matthias Kuhn
fuente
Hola Matthias, gracias por esta respuesta muy completa. Ciertamente parece que has respondido mi pregunta y más. Permíteme un poco de tiempo para trabajar con los métodos, y otorgaré la recompensa.
Dan
@Matthias Kuhn ¿Es posible agregar una lista de valores de un csv a valueMap () con QGIS 2.0 o 2.2? Además, ¿sería posible actualizar mediante programación la lista con los nuevos valores agregados por el usuario?
user25976
@Matthias Usted es uno de los desarrolladores de QGis, ¿sí? Esta información es muy útil; tal vez debería agregarse al libro de cocina de QGis ( docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook ). Actualmente tomé mucho google'ing para encontrar esta pregunta y la API no ayudó mucho (especialmente sobre la diferencia entre EditForm, EditorLayout, EditorWidgetV2).
Rauni
@Matthias Cuando dijo "El método descrito aquí seguirá funcionando pero está marcado como obsoleto", ¿hizo referencia al método setEditorLayout o a los métodos setEditForm + setEditFormInit?
Rauni
@Rauni Gracias por el aporte con el Cookbook. setEditForm, setEditFormInity setEditorLayoutno están en desuso. Sólo los métodos relacionados widget de ( setEditType, valueMap, widgetSizeetc.) a excepción de setFieldEditabley setLabelOnTop.
Matthias Kuhn