Demo 2

Feature-Auswahl

Demo 2 Screenshot

Interaktion mit der Karte und Features

Was wir lernen werden

1. Layer Abfrage über qgisProject Objekt

// imports qgisProject import org.qfield // get QgsVectorLayer by name let layer = qgisProject.mapLayersByName("plots")[0]

1. Feature Abfrage über LayerUtils

//imports LayerUtils import org.qfield // build your expression just like in QGIS let expression = "plot_id = 'plot_123'" // create feature iterator from expression let it = LayerUtils.createFeatureIteratorFromExpression(layer, expression) if (it.hasNext()) { // Real QgsFeature const feature = it.next() it.close() } it.close();

Karteninteraktionen abfangen mit pointHandler

// imports iface import org.qfield Item { // 1. Add the pointHandler to the plugin property var handler: iface.findItemByObjectName("pointHandler") Component.onCompleted: { // 2. register the point handler and define its callback handler.registerHandler("demo2_selection", (point, type, interactionType) => { if(point === "the right point"){ // block other handlers return true } else { // not using the point, pass event to other handlers return false } } }); // 3. Deregister the point handler on destruction (project close) Component.onDestruction: { handler.deregisterHandler("demo2_selection"); } }

Karteninteraktionen abfangen mit pointHandler

Point Handler interactionType

var isMobile = Qt.platform.os === "ios" || Qt.platform.os === "android" var shouldHandle = (isMobile && interactionType === "doubleClicked") || (!isMobile && interactionType === "clicked")

Android nicht getestet (aber wahrscheinlich ähnlich wie iOS)

Point Handler Koordinaten

let mapCanvas = iface.mapCanvas() handler.registerHandler("demo2_selection", (point, type, interactionType) => { // 20 pixel tolerance box let tl = mapCanvas.mapSettings.screenToCoordinate(Qt.point(point.x - 20, point.y - 20)) let br = mapCanvas.mapSettings.screenToCoordinate(Qt.point(point.x + 20, point.y + 20)) let topleft = tl.x + " " + tl.y let topright = br.x + " " + tl.y let bottomright = br.x + " " + br.y let bottomleft = tl.x + " " + br.y let wkt = "'POLYGON((" + topleft + ", " + topright + ", " + bottomright \ + ", " + bottomleft + ", " + topleft + "))'" let expression = "intersects(geom_from_wkt("+wkt+"), $geometry)" let it = LayerUtils.createFeatureIteratorFromExpression(layer, expression) }

Daten an Component übergeben

Loader { id: pluginLoader source: Qt.resolvedUrl('./components/d2_plugin_component.qml') } pluginLoader.item.plotId = feature.attribute("plot_id")

pluginLoader.item = Root-Element der Component

Property-Bindung in Component

// d2_plugin_component.qml Rectangle { id: pluginFrame property string plotId: "" Text { id: messageBox text: "Plot loaded: " + pluginFrame.plotId // Automatisch aktualisiert! } }

Merke das Unterschied zu den Imperative Assignment: Property-Bindung macht UI-Updates automatisch!

Benutzerdefinierte Signale

Plugin mit Button schließen:

// In Component: Signal definieren Rectangle { id: pluginFrame signal closed() Button { onClicked: { closed() } } } // Im Plugin: Signal verbinden Item { id: plugin Loader{} Connections { target: pluginLoader.item function onClosed() { pluginLoader.active = false } } }

Zu viele verschiedene Mechanismen für Interaktionen? Ja, denke ich auch.

Übungen für die nächsten 20 Minuten

Aufgaben:

Demo2a

1 / 13