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…
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.
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.
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.
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.
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.
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…