Programmgesteuertes Verknüpfen der Ebene mit der benutzerdefinierten Benutzeroberfläche mithilfe von PyQGIS?

9

Ich weiß, dass es möglich ist, eine Ebene mit einer benutzerdefinierten Benutzeroberfläche zum Bearbeiten von Feature-Attributen über die QGIS-Oberfläche zu verknüpfen. Aber ist das mit Python möglich?

Dieser Link zeigt, wie Sie das Ergebnis manuell erzielen . Ich möchte jedoch in der Lage sein, Ebenen automatisch zu erstellen und sie eine benutzerdefinierte Benutzeroberfläche verwenden zu lassen, ohne die UI-Datei und -Methode jedes Mal neu definieren zu müssen.

Dan
quelle
1
@ Matthias Danke dafür! Als Plugin-Entwickler interessierte mich das Feature. Ich stelle jedoch fest, dass sich RoadForm.py im Projektverzeichnis befinden muss. Ist es möglich, eine Init-Funktion über ein Plugin zu definieren?
NZ Farmer

Antworten:

17

Formularlayout

Sie haben die folgenden Methoden, um dies zu tun:

QgsVectorLayer.setEditForm ('/ path / to / your / ui / file') zur Bereitstellung einer UI-Datei und QgsVectorLayer.setEditFormInit ('python.Function') zur Bereitstellung einer Python-Init-Methode

Wenn vlSie also einen QgsVectorLayer haben, wird das Folgende genau das tun, wonach Sie suchen

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

Ab QGIS 2.0 haben Sie auch:

QgsVectorLayer.setEditorLayout (QgsVectorLayer :: EditorLayout)

Geben Sie QgsVectorLayer.GeneratedLayoutan QgsVectorLayer.TabLayoutoder geben Sie QgsVectorLayer.UiFileLayoutan, welche Art von Layout Sie möchten. Auf diese Weise können Sie den neuen Drag & Drop-Designer (TabLayout) angeben.

Widget-Layout

Update: Ab QGIS 2.4 gibt es neue Methoden ( QgsVectorLayer.setEditorWidgetV2 und setEditorWidgetV2Config ), um einen Editor-Widget-Typ und seine Konfiguration zu ändern. Die hier beschriebene Methode funktioniert weiterhin, ist jedoch als veraltet markiert.

Es gibt eine Reihe von Methoden für die spezifischen Widgets, die Sie verwenden möchten:

Verwenden Sie QgsVectorLayer.setEditType (fieldIdx, editType) , um den Bearbeitungstyp anzugeben, den Sie für das Widget für den Feldindex fieldIdx verwenden möchten. editType ist eine davon .

Verwenden Sie die folgenden Methoden, um das Widget-Verhalten weiter zu konfigurieren (abhängig von den verfügbaren Widget-Konfigurationsoptionen):

Matthias Kuhn
quelle
Hallo Matthias, vielen Dank für diese sehr vollständig aussehende Antwort. Sieht sicher so aus, als hätten Sie meine Frage beantwortet und vieles mehr. Lassen Sie mir etwas Zeit, um die Methoden durchzuarbeiten, und ich werde das Kopfgeld vergeben.
Dan
@Matthias Kuhn Ist es möglich, mit QGIS 2.0 oder 2.2 eine Liste von Werten aus einer CSV zu valueMap () hinzuzufügen? Wäre es auch möglich, die Liste programmgesteuert mit neu vom Benutzer hinzugefügten Werten zu aktualisieren?
user25976
@Matthias Sie sind einer der QGis-Entwickler, ja? Diese Informationen sind sehr nützlich - möglicherweise sollten sie dem QGis-Kochbuch hinzugefügt werden ( docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook ). Derzeit habe ich viel googelt, um diese Frage zu finden, und die API hat nicht viel geholfen (insbesondere hinsichtlich des Unterschieds zwischen EditForm, EditorLayout, EditorWidgetV2).
Rauni
@Matthias Als Sie sagten "Die hier beschriebene Methode funktioniert weiterhin, ist jedoch als veraltet markiert.", Haben Sie auf die Methode setEditorLayout oder die Methoden setEditForm + setEditFormInit verwiesen?
Rauni
@Rauni Danke für die Eingabe mit dem Kochbuch. setEditForm, setEditFormInitUnd setEditorLayoutsind nicht veraltet. Nur die Widget verwandte Verfahren ( setEditType, valueMap, widgetSizeusw.) , mit Ausnahme setFieldEditableund setLabelOnTop.
Matthias Kuhn