WŁASNY FORMULARZ W QGIS

Człowiek się uczy całe życie, jak to mówią. Zupełnie nie byłem świadomy istnienia takiej opcji w QGIS o jakiej dziś napiszę. Otóż można w tym programie stworzyć swój własny formularz do wprowadzania lub edycji atrybutów obiektu. Jest to przydatne jeśli często korzystamy z jednej warstwy i wprowadzamy do niej obiekty albo modyfikujemy atrybuty i potrzebujemy to sobie ułatwić albo zabezpieczyć przed błędami.

Standardowy formularz z atrybutami obiektu w QGIS wygląda tak:

zwykly_form

Pola z atrybutami są poukładane w takiej kolejności jak występują w pliku shp.

Można jednak stworzyć formularz, w którym np. poukładamy pola w kolejności jaka nam odpowiada, albo niektóre z nich zablokujemy. Aby to osiągnąć musimy mieć Qt Designer (link). Możemy w nim budować elementy gui – formularze, okna, widgety itd. Wygląda to jakoś tak:

qtdesigner

Mój przykład jest oczywiście przerysowany, raczej nie zdecydowałbym się na takie pastele w tworzonej aplikacji, chodziło o to by pokazać zasadę. Najistotniejszą rzeczą jest aby pola w zbudowanym formularzu miały takie same nazwy jak pola w warstwie źródłowej. Gdy już mamy stworzony formularz możemy go podłączyć w QGIS. Żeby to zrobić wystarczy wybrać opcję jak na zrzucie poniżej.

ustawienia

Wybieramy opcję „z pliku UI” i podajemy jego lokalizację.

Ja poszedłem jednak krok dalej. Do takiego formularza można dołożyć skrypt pythona, który będzie odpowiadał za logikę formularza albo jego walidację. W moim przykładzie – w zależności od wartości wybranej z listy rozwijanej podświetlają się wybrane pola. Żeby kod pythona działał musimy podać nazwę funkcji ze skryptu, tak jak na zrzucie wyżej, plik ze skryptem powinien być w tym samym folderze co plik projektu (bo musimy zapisać projekt). Finalnie, po kliknięciu na obiekt, pokazuje nam się nasz własny formularz.

new_form

Poniżej przykład działania podłączonego skryptu – podświetlają się wybrane pola, w zależności od wybranej wartości pola „typ”.

logika

logika2

Skrypt który to realizuje wygląda tak:

 
from PyQt4.QtCore import *
from PyQt4.QtGui import *

def formatka(dialog, layerid, featureid):
	global nowa_formatka
	nowa_formatka = dialog
	global pole_typ
	pole_typ = dialog.findChild(QComboBox, "atr_typ")
	global pole_x1
	pole_x1 = dialog.findChild(QLineEdit, "atr_x1")
	global pole_x2
	pole_x2 = dialog.findChild(QLineEdit, "atr_x2")
	global pole_y
	pole_y = dialog.findChild(QLineEdit, "atr_y")

	pole_typ.currentIndexChanged.connect(walid_pole_typ)

def walid_pole_typ(text):
	if pole_typ.currentText() == "typ1":
		pole_x1.setStyleSheet("background-color: rgba(255, 107, 107, 150);")
		pole_x2.setStyleSheet("")
		pole_y.setStyleSheet("")
	elif pole_typ.currentText() == "typ2":
		pole_x2.setStyleSheet("background-color: rgba(255, 107, 107, 150);")
		pole_x1.setStyleSheet("")
		pole_y.setStyleSheet("")
	elif pole_typ.currentText() == "typ3":
		pole_y.setStyleSheet("background-color: rgba(255, 107, 107, 150);")
		pole_x2.setStyleSheet("")
		pole_x1.setStyleSheet("")
	else:
		pole_x1.setStyleSheet("")
		pole_x2.setStyleSheet("")
		pole_y.setStyleSheet("")

 

Skrypt nie jest skomplikowany jak widać. Deklarujemy zmienne globalne, przypinamy do listy rozwijanej wywołanie funkcji, która zmienia kolory pól. W ten sposób, w formularzu, po wyborze typu z listy rozwijanej wywoływana jest funkcja walid_pole_typ, która w zależności od wartości pola typ koloruje odpowiednie pole formularza. Oczywiście sama zmiana koloru to jeszcze żadna walidacja ale np. można sprawdzać czy wprowadzony do pola atrybutu ciąg znaków jest większy niż zero itp.

Related Posts