Hoppa till innehåll
Meny
  • Hem
  • Dokument
  • Om Mig
Geosupportsystem

Skapa koden till ditt QGIS plugin

Publicerat den 2017-09-27

Då så är det dags att skriva den kod som skall omvandla vårt plugin från något snyggt på skärmen, till något användbart.
Och Ja! Du behöver skriva Pythonkod. Du behöver inte vara speciellt duktig på Python, men det hjälper om du någorlunda förstår vad det handlar om. Däremot så tycker jag inte man behöver vara överdrivet försiktig. Vet man bara vad man vill göra så är Python inte svårare än att man kan Googla sig till de flesta lösningarna på i alla fall lite enklare problem. Att bara försöka, är ett bra sätt att börja lära sig Python.

Men först, hur gick det att byta ikon på knappen? Du har säkert hittat filen ”icon.png” i katalogen och provat att redigera denna (hoppas jag). Jag är däremot inte så säker på att du lyckats ändra knappen i gränssnittet…
Problemet är att det inte är en bildfil som används i QGIS, utan en kompilerad textsträng i Python. Denna finns lagrad i filen ”resources.py” och den kompileras inte om så länge innehållet i ”resources.qrc” inte ändras. Ett sätt är därför att helt sonika radera filen ”resources.py” (radera inte *.qrc -filen). När man sedan kör make deploy igen så kommer en ny ”resources.py” att genereras och föras över. När man sedan laddar om pluginet, så kommer den nya ikonen att synas.

Pythonkod

All kod vi skall skriva kommer att hamna i filen ”my_plugin.py”. Jag kommer att använda ”Bluefish” för att redigera min kod, men vilket editor som helst duger. Du kan till och med använda ”Anteckningar” i Windows om du nu måste…
Skärmbild från 2017-09-17 16-28-17.png
Innan vi börjar med kod så är det dock några saker som är bra att lösa först.
Börja med att bryta ner processen i komponenter, och då gärna komponenter som kan bli ”funktioner” i Python.
Jag vill exempelvis läsa in alla vektorlager och skapa en lista i den första combo-boxen så fort verktyget startar. Därför blir en funktion för mig create_vector_combo(). På samma sätt försöker jag bryta ner olika saker i delar som kan bli funktioner i koden.

  • create_vector_combo()
  • create_attribute_combo()
  • create_text_list()

Det behövs dessutom lite ytterligare kod men detta är de tre ”funktioner” som kan skapas separat.
Mina funktioner lägger jag till direkt efter ”__init___” funktionen i koden.
Skärmbild från 2017-09-17 16-45-40.png
Här gjorde jag ett litet fel i koden. Lägg bara till texten self först innanför parentesen. Om det står något mer redan så separera self från resten med ett kommatecken.
Koden ”pass” är bara tillfällig och gör ingenting. Den skall jag nu ersätta med något mera användbart. Den första funktionen har inget argument. Det behövs inte. Funktionen skall gå igenom alla inlästa lager och skapa en lista av alla vektorlager och generera poster i combo-boxen för detta.
De andra två tar argument var för att ange vilket lager och vilket attribut som skall användas för att skapa listan.

Skapa Lagercombon

För att allt skall fungera så behövs det lite resurser från QGIS. I början på koden så finns det texter som ”importerar” kod från andra resurser. Till att börja med så behövs det två ytterligare.
Skärmbild från 2017-09-17 17-24-57
Det är koden på rad 30-32 i bilden ovan som jag lagt till. Du behöver dock inte rad 31 (iface). Detta hämtar klasserna iface och QgsMapLayer.
Skärmbild från 2017-09-17 17-49-31
Funktionen create_vector_combo(self) skapas sedan med referenser till dessa klasser för att läsa tillgängliga lager och för att kontrollera om dessa är av typen ”vektor”.
Om de är det så läggs de till i combo_layer som skapades tidigare i Qt Designer. Om du använde andra namn där så får du anpassa koden, men principen är den samma för att komma åt element i gränssnittet. ”self.dlg.” föregår elementnamnet och sedan beror det på vad det är för typ av objekt, men addItem() är en funktion som finns för just comboboxen.
För att funktionen skall köras så måste den även anropas. Detta görs i run funktionen i slutet av koden.
Skärmbild från 2017-09-17 17-30-47
Det är koden på rad 204 i bilden ovan som anropar funktionen.
När jag sedan sparar och kompilerar koden (make deploy) och laddar om pluginet i QGIS så kan jag få upp en dialog med inlästa vektorlager i den första comboboxen.
plugin1
Jag tror att det räcker för den här gången. Det är inte säkert att det gick lika smärtfritt för dig som jag beskriver det här (det gjorde det inte för mig i verkligheten i alla fall). Det är bättre att du får smälta koden så här långt och se till att det fungerar så här långt.
I nästa del skall vi koppla kod till en händelse i gränssnittet och se om det inte går att uppdatera comboboxen med attribut beroende på vilket lager man väljer…

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Translate with Google

GBR In English
GER Auf Deutch
FRA En Français
ESP En Español
Swedish is a hard language for a machine to translate. Nuance and detail will likely be lost.
     Mastodon  

Bok om QGIS på Svenska

Bok

Beställ Boken/E-bok genom att klicka på bilden (även förhandsgranskning).

Senaste kommentarer

  • Daniel Nilsson om QField
  • denis Empisse om SpaceMouse Python
  • klakar om SpaceMouse Python
  • Anders Jackson om Återbesök, WebODM
  • Anders Jackson om SpaceMouse Python

Arkiv

Meta

  • Logga in
  • Flöde för inlägg
  • Flöde för kommentarer
  • WordPress.org
©2025 Geosupportsystem | WordPress-tema av Superbthemes.com