demo1_hello.qml

Dies ist die Haupt-QML-Datei, die den Plugin-Code und seine Toolbar-Schaltflächen lädt und entlädt.

// <!--Imports...-->

import org.qfield 
import Theme  



Item {  
  id: plugin
  parent: iface.mapCanvas() 
  anchors.fill: parent 
  Loader {
    id: pluginLoader
    active: false
    anchors.fill: parent
    source: Qt.resolvedUrl('./components/d1_plugin_component.qml')
  }  
  QfToolButton {
    id: pluginButton
    bgcolor: Theme.darkGray
    iconSource: Theme.getThemeVectorIcon('ic_camera_photo_black_24dp')
    iconColor: Theme.mainColor
    round: true

    onClicked: {
      iface.logMessage("Loading d1_plugin_component.qml")
      pluginLoader.active = !(pluginLoader.active)
    }
  }

  Component.onCompleted: {
    iface.addItemToPluginsToolbar(
      pluginButton
    )
  }
}

Klassen in unserer Demo


QObject
|___ QtObject
|    |___  Item (Base for Visual Types, like QtWidget)
|    |    |___ Rectangle
|    |    |___ Text
|    |    |___ Image
|    |    |___ MouseArea
|    |    |___ Loader 
|    |    |___ Controls
|    |    |    |___ Button
|    |    |    |___ AbstractButton
|    |    |    |    |___ QToolButton
|    |    |    |    |    |___ QfToolButton
|    |___  Component (Container/Utility Class. Not related to Item!)
|    |___  Connections
|    |___  Other non visual types and utilities

Item (plugin):

Properties

Mitglieder des Plugin-Items:

Component.onCompleted

Dies ist die Signal-Slot-Konstruktion, die das Hinzufügen des pluginButton zur QField-Toolbar auslöst, wenn das Plugin-Item erstellt wurde.

Wenn man sich Component.onCompleted innerhalb von Item ansieht und auch berücksichtigt, dass der Loader eine Component lädt, könnte man dazu verleitet werden zu denken, dass Component die Elternklasse von Item ist, und dieses Signal geerbt wird.

Das ist nicht der Fall. Component und Item haben nichts miteinander zu tun.

Loader (pluginLoader):

Ein Loader ist ein Item, das dynamisch andere Items lädt und entlädt. Loader konstruieren und destruieren ihre Components, wenn ihr "active"-Property-Wert umgeschaltet wird, was Runtime-Trigger für Konstruktion und Destruktion ermöglicht. Dies macht es möglich, das Laden des Plugins mit einer Schaltfläche auszulösen.

Warum wir hier einen Loader brauchen:

Unser Plugin wird Dinge tun wie Layer im Projekt lesen. Wir wollen nicht, dass dies passiert, bis das Projekt geladen ist. Tatsächlich wollen wir, dass unser Plugin-Code wartet, bis der Benutzer danach fragt, indem er auf die Tool-Schaltfläche des Plugins klickt oder später ein Objekt auf der Karte auswählt.

Wenn wir unseren Plugin-Code direkt in unser Root-Item ohne den Loader legen würden, würden wir versuchen, Layer zu lesen, die noch nicht existieren, und viel Verarbeitung durchführen, die möglicherweise nicht benötigt wird.

Properties

QfToolButton (pluginButton)

Das ist einfach. QfToolButton ist ein Tool-Button-Widget, das wir mit dem Loader verbunden haben. Wir könnten den QToolButton verwenden, aber wir verwenden hier den QfToolButton von QField, damit er QFields Design beibehält. Für den Rest des Plugins bevorzuge ich tendenziell die Qt-Objekte.

Ich kann QfToolButton oder jedes andere QField-Widget verwenden, weil ich sie aus org.qfield importiert habe.

Dieses Item ist nicht im Loader, weil es das Item ist, das den Loader steuert.

Properties

Denken Sie daran, es ist nicht Component.onClicked. Alles außer onCompletion und onDestruction sind Mitglieder des Item-Components und haben nichts mit Component zu tun.