Zachęcony opisem sposobu rozszerzenia funkcjonalności formularzy też postanowiłem przejść inicjację
Podczas testów zauważyłem, że jeżeli raz wywołamy taki zmodyfikowany formularz, a następnie zmienimy coś w kodzie, zapiszemy i wywołamy ponownie, to QGIS nie widzi tych zmian. Nie pomaga przeładowanie projektu. Konieczne jest całkowite zamknięcie i ponowne uruchomienie programu. Dodatkowo po zamknięciu pojawia się informacja, że QGIS działał nieprawidłowo i został zamknięty (QGIS 1.7 i 1.8, WinXP).
Co ciekawe, w oknie z opisem błędów w QGIS (Wystąpił błąd podczas wykonywania kodu Pythona: Traceback (most recent call last):......) pojawia się zawsze aktualny kod, ale wykonywany jest ten z pierwszego uruchomienia formularza.
Poza tym wszystko działa
Później wrzucę kawałek kodu.
Poniżej zamieszczam przykład formularza z rozszerzonym zakresem funkcji. Przykład jest podobny do problemu, który próbuje rozwiązać
brylu.
W oknie mamy 4 Radio Buttony, którymi wybieramy porę roku. Obok jest Combo Box z listą miesięcy danej pory. Zmiana pory roku powoduje zmianę listy miesięcy.
rys1
Kod:
# -*- coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
okno = None
wiosna = None
lato = None
jesien = None
zima = None
miesiac = None
def inicjacja(formularz,idWarstwy,idObiektu):
global okno
okno = formularz
global wiosna
wiosna = okno.findChild(QRadioButton,"wiosna")
global lato
lato = okno.findChild(QRadioButton,"lato")
global jesien
jesien = okno.findChild(QRadioButton,"jesien")
global zima
zima = okno.findChild(QRadioButton,"zima")
global miesiac
miesiac = okno.findChild(QComboBox,"miesiac")
wiosna.toggled.connect(menuWiosna)
lato.toggled.connect(menuLato)
jesien.toggled.connect(menuJesien)
zima.toggled.connect(menuZima)
def menuWiosna(test):
if test == True:
miesiac.clear()
miesiac.addItems([u'Marzec', u'Kwiecień', u'Maj', u'Czerwiec'])
def menuLato(test):
if test == True:
miesiac.clear()
miesiac.addItems([u'Czerwiec', u'Lipiec', u'Sierpień', u'Wrzesień'])
def menuJesien(test):
if test == True:
miesiac.clear()
miesiac.addItems([u'Wrzesień', u'Październik', u'Listopad', u'Grudzień'])
def menuZima(test):
if test == True:
miesiac.clear()
miesiac.addItems([u'Grudzień', u'Styczeń', u'Luty', u'Marzec'])
Kod należy zapisać w pliku pory_roku_funkcje.py w katalogu z projektem.
Definicja formularza w załączniku (należy zmienić rozszerzenie z txt na ui).
Ustawienia warstwy, do której dodajemy formularz
rys2