Associando programaticamente a camada à interface do usuário personalizada usando PyQGIS?

9

Eu sei que é possível associar uma camada a uma interface do usuário personalizada para editar atributos de recurso usando a interface QGIS. Mas isso é possível com o Python?

Este link mostra como alcançar o resultado manualmente . Mas eu gostaria de poder criar camadas automaticamente e fazer com que elas usem a interface do usuário personalizada sem precisar redefinir o arquivo e o método da interface do usuário a cada vez.

Dan
fonte
1
@ Matthias Obrigado por isso! Como desenvolvedor de plugins, eu estava interessado no recurso. No entanto, observo que o RoadForm.py precisa estar localizado no diretório do projeto. É possível definir uma função init a partir de um plug-in?
NZ Farmer

Respostas:

17

Layout do formulário

Você tem os seguintes métodos para fazer isso:

QgsVectorLayer.setEditForm ('/ path / to / your / ui / file') para fornecer um arquivo de interface do usuário e QgsVectorLayer.setEditFormInit ('python.Function') para fornecer um método de inicialização python

Portanto, com um QgsVectorLayer, vlo seguinte fará o que você está procurando

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

A partir do QGIS 2.0, você também terá:

QgsVectorLayer.setEditorLayout (QgsVectorLayer :: EditorLayout)

Fornecer QgsVectorLayer.GeneratedLayout, QgsVectorLayer.TabLayoutou QgsVectorLayer.UiFileLayoutpara especificar que tipo de layout que você deseja. Isso permite especificar o novo designer de arrastar e soltar (TabLayout).

Layout do widget

Atualização: a partir do QGIS 2.4, haverá novos métodos ( QgsVectorLayer.setEditorWidgetV2 e setEditorWidgetV2Config ) para alterar o tipo de widget do editor e sua configuração. O método descrito aqui ainda funcionará, mas está marcado como obsoleto.

Existem vários métodos relacionados aos widgets específicos que você deseja usar:

Use QgsVectorLayer.setEditType (fieldIdx, editType) para especificar o tipo de edição que você deseja usar para o widget do índice de campo fieldIdx. editType é um deles .

Para configurar ainda mais o comportamento do widget, use os seguintes métodos (dependendo das opções de configuração disponíveis, é claro):

Matthias Kuhn
fonte
Oi Matthias, Obrigado por esta resposta muito completa. Certamente parece que você respondeu minha pergunta e muito mais. Permita-me um pouco de tempo para trabalhar com os métodos, e eu concederei a recompensa.
Dan
@ Matthias Kuhn É possível adicionar uma lista de valores de um csv ao valueMap () com o QGIS 2.0 ou 2.2? Além disso, seria possível atualizar programaticamente a lista com novos valores adicionados pelo usuário?
User25976
@ Matthias Você é um dos desenvolvedores de QGis, sim? Esta informação é muito útil - talvez deva ser adicionada ao livro de receitas do QGis ( docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook ). Atualmente, pesquisei bastante no google para encontrar essa pergunta e a API não ajudou muito (principalmente sobre a diferença entre EditForm, EditorLayout, EditorWidgetV2).
Rauni
@ Matthias Quando você disse "O método descrito aqui ainda funcionará, mas está marcado como descontinuado.", Você fez referência ao método setEditorLayout ou aos métodos setEditForm + setEditFormInit?
Rauni
@Rauni Obrigado pela contribuição do livro de receitas. setEditForm, setEditFormInitE setEditorLayoutnão estão obsoletos. Apenas os métodos Widget relacionados ( setEditType, valueMap, widgetSizeetc.), exceto setFieldEditablee setLabelOnTop.
Matthias Kuhn