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.
Antworten:
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
vl
Sie also einen QgsVectorLayer haben, wird das Folgende genau das tun, wonach Sie suchenAb QGIS 2.0 haben Sie auch:
QgsVectorLayer.setEditorLayout (QgsVectorLayer :: EditorLayout)
Geben Sie
QgsVectorLayer.GeneratedLayout
anQgsVectorLayer.TabLayout
oder geben SieQgsVectorLayer.UiFileLayout
an, 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):
quelle
setEditForm
,setEditFormInit
UndsetEditorLayout
sind nicht veraltet. Nur die Widget verwandte Verfahren (setEditType
,valueMap
,widgetSize
usw.) , mit AusnahmesetFieldEditable
undsetLabelOnTop
.