Secara terprogram menghubungkan lapisan dengan UI khusus menggunakan PyQGIS?

9

Saya tahu dimungkinkan untuk mengaitkan layer dengan UI khusus untuk mengedit atribut fitur menggunakan antarmuka QGIS. Tetapi apakah ini mungkin dengan Python?

Tautan ini menunjukkan cara mencapai hasil secara manual . Tapi saya ingin dapat membuat layer secara otomatis dan meminta mereka menggunakan custom UI tanpa harus mendefinisikan ulang file ui dan metode setiap kali.

Dan
sumber
1
@Matithias Terima kasih untuk ini! Sebagai pengembang plugin saya tertarik dengan fitur ini. Namun, saya perhatikan bahwa RoadForm.py perlu ditemukan di direktori Project. Apakah mungkin untuk mendefinisikan fungsi init dari Plugin?
Petani NZ

Jawaban:

17

Tata letak formulir

Anda memiliki metode berikut untuk melakukan ini:

QgsVectorLayer.setEditForm ('/ path / ke / ui / file') untuk menyediakan file UI dan QgsVectorLayer.setEditFormInit ('python.Function') untuk menyediakan metode python init

Jadi memiliki QgsVectorLayer vlberikut ini akan melakukan apa yang Anda cari

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

Mulai dari QGIS 2.0 Anda juga akan memiliki:

QgsVectorLayer.setEditorLayout (QgsVectorLayer :: EditorLayout)

Berikan QgsVectorLayer.GeneratedLayout, QgsVectorLayer.TabLayoutatau QgsVectorLayer.UiFileLayoutuntuk menentukan tata letak seperti apa yang Anda inginkan. Ini memungkinkan Anda menentukan desainer seret dan lepas baru (TabLayout).

Tata letak widget

Pembaruan: mulai dari QGIS 2.4 akan ada metode baru ( QgsVectorLayer.setEditorWidgetV2 dan setEditorWidgetV2Config ) untuk mengubah jenis widget editor dan konfigurasinya. Metode yang dijelaskan di sini masih akan bekerja tetapi ditandai sebagai usang.

Ada sejumlah metode yang terkait dengan widget spesifik yang ingin Anda gunakan:

Gunakan QgsVectorLayer.setEditType (fieldIdx, editType) untuk menentukan tipe edit yang ingin Anda gunakan untuk widget untuk indeks bidang fieldIdx. editType adalah salah satunya .

Untuk lebih lanjut mengkonfigurasi perilaku widget gunakan metode berikut (tergantung pada opsi konfigurasi widget yang tersedia tentu saja):

Matthias Kuhn
sumber
Hai Matthias, Terima kasih atas jawaban yang sangat lengkap ini. Jelas sepertinya Anda telah menjawab pertanyaan saya dan lebih dari itu. Izinkan saya sedikit waktu untuk bekerja melalui metode, dan saya akan memberi hadiah.
Dan
@Matthias Kuhn Apakah mungkin untuk menambahkan daftar nilai dari csv ke valueMap () dengan QGIS 2.0 atau 2.2? Juga, mungkinkah untuk memperbarui daftar dengan nilai yang baru ditambahkan oleh pengguna?
user25976
@Matthias Anda adalah salah satu pengembang QGis, ya? Informasi ini sangat berguna - mungkin ini harus ditambahkan ke buku masak QGis ( docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook ). Saat ini saya mengambil banyak google'ing untuk menemukan pertanyaan ini dan API tidak banyak membantu (terutama tentang perbedaan antara EditForm, EditorLayout, EditorWidgetV2).
Rauni
@Matthias Ketika Anda mengatakan "Metode yang dijelaskan di sini akan tetap berfungsi tetapi ditandai sebagai usang.", Apakah Anda merujuk ke metode setEditorLayout atau metode setEditForm + setEditFormInit?
Rauni
@Rauni Terima kasih atas masukan dengan Cookbook. setEditForm, setEditFormInitdan setEditorLayouttidak usang. Hanya metode widget terkait ( setEditType, valueMap, widgetSizedll) kecuali untuk setFieldEditabledan setLabelOnTop.
Matthias Kuhn