Đặt giá trị mặc định trong trường QGIS


12

Tôi muốn thêm vào trường của một lớp một giá trị mặc định. Ý tôi là, mỗi khi một tính năng mới được tạo, trường đó sẽ tự động được điền với giá trị mặc định.

Trong trường hợp của tôi, giá trị mặc định sẽ là biến @project_filename (tên tệp của dự án).

Tôi không thể tìm thấy chức năng này ở bất cứ đâu.

Trân trọng,

Câu trả lời:


8

Kể từ QGIS 2.18, đi đến thuộc tính lớp / thuộc tính trường và đặt biểu thức ( @project_filenametrong trường hợp này) làm giá trị mặc định.

Giá trị mặc định dựa trên biểu thức

https://www.qgis.org/en/site/forusers/visualchangelog218/index.html#feature-client-side-default-field-values


1
Trong API C ++ nếu tôi không nhầm thì có lớp QssDefaultValue để thực hiện theo chương trình. Có trăn thay thế cho điều đó?
shika-kun

Nếu bạn hỏi đây là một câu hỏi mới, tôi sẽ vui lòng trả lời nó. Chỉ cần gửi cho tôi một lời nhắc ở đây;)
Matthias Kuhn


10

Bạn có thể định nghĩa một hàm thêm tên tệp dự án làm thuộc tính và kết nối hàm này với sự kiện có thêm tính năng. Bạn có thể sử dụng mã sau đây, thay đổi tên của trường thành bất cứ thứ gì bạn chọn (tôi đã sử dụng Name) và dán nó vào Bảng điều khiển Python . Bây giờ bất cứ khi nào bạn thêm một tính năng mới, trường sẽ được điền với tên dự án hiện tại:

import os

# Get project name
project = QgsProject.instance()
project_name = os.path.basename(project.fileName())

# Set active layer
layer = qgis.utils.iface.activeLayer()

# Define function to select added feature and add attribute to field "Name"
def update(featureAdded):
    idx = layer.fieldNameIndex('Name')
    layer.changeAttributeValue(featureAdded, idx, project_name)

# Connect "featureAdded" event to "select" function
layer.featureAdded.connect(update)

Kết quả


1
Bạn có cần chạy tập lệnh mỗi khi bạn chỉnh sửa lớp hoặc tập lệnh vẫn được lưu trong dự án qgis không?
Vale

1
@Vale - Bạn có thể lưu tập lệnh dưới dạng macro sẽ được lưu trữ trong dự án QGIS. Tôi sẽ chỉnh sửa bài đăng để bao gồm điều này =)
Joseph

1
Tại sao bạn cần chọn tính năng Joseph?
Germán Carrillo

3
Tôi không nghĩ cần phải đăng một câu hỏi khác, vì sẽ có quá nhiều sự chồng chéo. Bạn đang thực sự gần gũi. Tôi đề nghị bạn tránh chọn tính năng. Những gì bạn nhận được dưới dạng tham số khi TÍN HIỆU featureAddedđược kích hoạt, thực sự là một id tính năng. Và đó là tất cả những gì bạn cần để gọi changeAttributeValue. Vào updatehàm bạn sẽ chỉ cần 2 dòng (sử dụng tên biến của bạn): idx = layer.fieldNameIndex('Name')layer.changeAttributeValue(featureAdded, idx, project_name).
Germán Carrillo

1
@ GermánCarrillo - Điều đó thật hiệu quả, thật đơn giản! Cảm ơn bạn đã gợi ý tuyệt vời của bạn! Tôi học được điều gì đó mỗi ngày =)
Joseph
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.