Liczba postów: 48
7
Dołączył: 19-04-2010
Reputacja:
0
RE: Formularze dla edycji danych
(22-09-2011, 00:02)borys napisał(a): W Designerze możesz podłączać sygnały z jednych widgetów bezpośrednio do slotów innych widgetów (np. sygnał pressed z klawisza do slotu clear linii edycyjnej albo close całego okna), ale wiele więcej się w ten sposób nie zdziała.
To, czego potrzebujesz to, jak mniemam, podłączyć sygnał z widgetu do własnej funkcji, która po przeanalizowaniu stanu tego widgetu podejmie stosowne kroki, np. ustawiając inny widget. W tym celu musisz napisać dwie funkcje. Pierwsza to ta, która ma być wykonana po nadejściu sygnału, zaś druga, to funkcja inicjalizująca formularz. Jej zadaniem jest, poza wstępnym ustawieniem widgetów, właśnie podłączenie sygnałów do własnoręcznie napisanych funkcji. To właśnie tę funkcję inicjalizującą podajemy w tajemniczym polu 'inicjacja formularza' (z bykiem - o czym ja myślałem, tłumacząc ten napis... ) we właściwościach warstwy.
Może nie jest najprostszy, ale na pierwszym listingu widać funkcję formOpen, a w niej podłączenie syngału accepted z buttonBoxa do zdefiniowanej zaraz potem funkcji validate:
buttonBox.accepted.connect(validate)
Ten kod jest zapisany w pliku RoadForm.py i wrzucony do tego samego katalogu, w którym jest plik projektu. Na pierwszym zrzucie po tym listingu widać wywołanie funkcji formOpen we właściwościach warstwy: nazwa pliku bez rozszerzenia - kropka - nazwa funkcji.
Tak właśnie mi się wydawało, że w Designerze nie można zrobić takiego szacher-macher Na artykuł, który podałeś w linku trafiłem już wcześniej ale nie bardzo rozumiem co tam jest czym - może dlatego, że nie znam pythona w ogóle i nie umiem się posługiwać jego składnią (kiedyś bawiłem się tylko trochę w delphi). Żeby zacząć coś samemu potrzebuję najprostszego skryptu z wyjaśnieniem co jest co i ewentualnie zaznaczeniem co do czego się odwołuje, wtedy może jakoś uda mi się z tym wystartować. Jak komuś z Was się będzie chciało takie coś zrobić to będę wdzięczny. Taki rodzaj inicjacji....
23-09-2011, 22:21, (Ten post był ostatnio modyfikowany: 23-09-2011, 23:08 {2} przez Rayo.)
Liczba postów: 352
47
Dołączył: 09-12-2009
Reputacja:
3
RE: Formularze dla edycji danych
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 *
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")
Liczba postów: 48
7
Dołączył: 19-04-2010
Reputacja:
0
RE: Formularze dla edycji danych
Rayo jesteś wielki Co prawda nie usiadłem do tego jeszcze i dzisiaj pewnie już nie usiądę bo nie znajdę na to czasu.... (choć kusi mnie żeby rzucić wszystko inne). Z pewnością jednak startuję od jutra i dam znać jak mi poszło.
Liczba postów: 352
47
Dołączył: 09-12-2009
Reputacja:
3
RE: Formularze dla edycji danych
Uważaj na linie 'global wiosna' i 'global miesiac'. Przy kopiowaniu coś za bardzo się przesunęły i mogą powodować błąd. Mają mieć takie same wcięcia jak linie następujące po nich.
Życzę powodzenia. Daj znać, czy przy stosowaniu takich rozszerzonych formularzy QGIS zgłasza błąd podczas wychodzenia z programu.
27-09-2011, 13:12, (Ten post był ostatnio modyfikowany: 27-09-2011, 13:53 {2} przez brylu.)
Liczba postów: 48
7
Dołączył: 19-04-2010
Reputacja:
0
RE: Formularze dla edycji danych
Dobra. Mam pierwsze pytania.
1. Czym u Ciebie w projekcie jest okno? Czy to jest nazwa QGroupBox na którym znajdują sie QRadioButtony? A może coś innego?
2. w inicjacji podajesz w nawiasie jakieś zmienne (formularz,idWarstwy,idObiektu). Do czego się one odnoszą?
3. Dlaczego w miesiac.addItems zapisujesz u'Marzec', u'Kwiecień', u'Maj'? Co to znaczy?
To na wstępie tyle
W każdym razie robię małe kroczki naprzód
Na początek odtworzyłem w pełni Twój formularz. Niestety, prawdopodobnie mam coś nie tak z pythonem na komputerze, bo przy próbie odpalenia wywala jakieś dwa błędy ale podobnie historie mam również z większością wtyczek więc to prawdopodobnie nie jest wina skryptu. Tak czy inaczej skrypt nie działa... Natomiast efekt błędu przy zamykaniu QGIS (1.7 Wrocław) osiągnąłem w pełni Będę musiał to przetestować na innym komputerze jeszcze.
Liczba postów: 48
7
Dołączył: 19-04-2010
Reputacja:
0
RE: Formularze dla edycji danych
Ok. Testowałem już na innym kompie i niestety dalej nic. Za każdym razem kiedy uruchamia się formularz wyskakują jakieś błędy pythona. Zastanawiam się czy może coś jeszcze powinienem doinstalować na komputerze. W dalszej kolejności sam formularz sie pojawia ale nie ma opcji walidacji.
Tak przy okazji czy mógłbyś opisać w jaki sposób działa Twój skrypt? To znaczy co się dzieje kiedy zmieniam np. radiobutton na wiosna albo na lato?
28-09-2011, 19:19, (Ten post był ostatnio modyfikowany: 28-09-2011, 19:56 {2} przez Rayo.)
Liczba postów: 352
47
Dołączył: 09-12-2009
Reputacja:
3
RE: Formularze dla edycji danych
Co to za błąd? Pokaż zrzut ekranu, albo skopiuj tekst błędu.
W załączniku umieściłem plik z kodem. Trzeba mu tylko zmienić rozszerzenie na .py
Może przy wklejaniu tekstu coś się poprzestawiało i stąd te błędy.
Opis skryptu:
Ustawienie kodowania na utf8 (żeby nie było problemu z polskimi znakami),
import modułów QT,
wyczyszczenie zmiennych.
Kod:
# -*- coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
Funkcja inicjalizująca formularz - podpina dodatkowe funkcje pod określone sygnały (te których nie dało się podpiąć w QT Designerze)
- przypisanie naszego formularza do obiektu globalnego (widzianego we wszystkich funkcjach) okno
- przypisanie poszczególnych RadioButtonów do obiektów globalnych
- przypisanie ComboBoxa do obiektu globalnego
- podłączenie sygnałów zmiany stanu RadioButtonów do odpowiednich funkcji
Kod:
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")
Funkcja zmieniająca listę miesięcy w ComboBox
- sprawdzenie, czy stan zmienił się na 'włączony'
- wyczyszczenie listy miesięcy
- dodanie nowych pozycji do listy miesięcy
Kod:
def menuWiosna(test):
if test == True:
miesiac.clear()
miesiac.addItems([u'Marzec', u'Kwiecień', u'Maj', u'Czerwiec'])