Lớp liên kết lập trình với giao diện người dùng tùy chỉnh bằng PyQGIS?


9

Tôi biết có thể liên kết một lớp với giao diện người dùng tùy chỉnh để chỉnh sửa các thuộc tính tính năng bằng giao diện QGIS. Nhưng điều này có thể với Python không?

Liên kết này cho thấy làm thế nào để đạt được kết quả bằng tay . Nhưng tôi muốn có thể tạo các lớp tự động và cho chúng sử dụng UI tùy chỉnh mà không phải xác định lại tệp ui và phương thức mỗi lần.


1
@Matthias Cảm ơn bạn vì điều này! Là một nhà phát triển plugin, tôi quan tâm đến tính năng này. Tuy nhiên, tôi lưu ý rằng RoadForm.py cần được đặt trong thư mục của Dự án. Có thể định nghĩa một hàm init từ Plugin không?
Nông dân New Zealand

Câu trả lời:


17

Bố cục mẫu

Bạn có các phương pháp sau để làm điều này:

QssVectorLayer.setEditForm ('/ path / to / your / ui / file') để cung cấp tệp UI và QgsVectorLayer.setEditFormInit ('python.Factor') để cung cấp phương thức khởi tạo python

Vì vậy, việc có QssVectorLayer vlsau đây sẽ làm những gì bạn đang tìm kiếm

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

Bắt đầu từ QGIS 2.0, bạn cũng sẽ có:

QssVectorLayer.setEditorLayout (QssVectorLayer :: EditorLayout)

Cung cấp QgsVectorLayer.GeneratedLayout, QgsVectorLayer.TabLayouthoặc QgsVectorLayer.UiFileLayoutđể xác định những loại bố trí mà bạn muốn. Điều này cho phép bạn chỉ định trình thiết kế kéo và thả mới (TabLayout).

Bố cục widget

Cập nhật: bắt đầu từ QGIS 2.4, sẽ có các phương thức mới ( QssVectorLayer.setEditorWidgetV2setEditorWidgetV2Config ) để thay đổi loại tiện ích soạn thảo và cấu hình của nó. Phương pháp được mô tả ở đây vẫn sẽ hoạt động nhưng được đánh dấu là không dùng nữa.

Có một số phương pháp liên quan đến các widget cụ thể mà bạn muốn sử dụng:

Sử dụng QssVectorLayer.setEditType (fieldIdx, editType) để chỉ định loại chỉnh sửa bạn muốn sử dụng cho tiện ích cho chỉ mục trường fieldIdx. editType là một trong số này .

Để tiếp tục định cấu hình hành vi của widget, hãy sử dụng các phương pháp sau (tùy thuộc vào các tùy chọn cấu hình widget có sẵn):


Xin chào Matthias, Cảm ơn bạn vì câu trả lời rất đầy đủ này. Chắc chắn có vẻ như bạn đã trả lời câu hỏi của tôi và hơn thế nữa. Cho phép tôi một chút thời gian để làm việc thông qua các phương pháp và tôi sẽ thưởng tiền thưởng.
Dan

@Matthias Kuhn Có thể thêm danh sách các giá trị từ csv vào valueMap () với QGIS 2.0 hoặc 2.2 không? Ngoài ra, liệu có thể lập trình cập nhật danh sách với các giá trị mới được người dùng thêm vào không?
dùng25976

@Matthias Bạn là một trong những nhà phát triển của QGis, phải không? Thông tin này rất hữu ích - có lẽ nên thêm thông tin này vào sách dạy nấu ăn của QGis ( docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook ). Hiện tại tôi đã mất rất nhiều google để tìm câu hỏi này và API không giúp được gì nhiều (đặc biệt là về sự khác biệt giữa EditForm, EditorLayout, EditorWidgetV2).
Rauni

@Matthias Khi bạn nói "Phương thức được mô tả ở đây vẫn sẽ hoạt động nhưng được đánh dấu là không dùng nữa.", Bạn đã tham khảo phương thức setEditorLayout hay phương thức setEditForm + setEditFormInit?
Rauni

@Rauni Cảm ơn bạn đã đóng góp với Cookbook. setEditForm, setEditFormInitsetEditorLayoutkhông phản đối. Chỉ có phương pháp liên quan đến phụ tùng ( setEditType, valueMap, widgetSizevv) trừ setFieldEditablesetLabelOnTop.
Matthias Kuhn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.