Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Formularze dla edycji danych
22-09-2011, 20:34,
#11
RE: Formularze dla edycji danych
W końcu się dowiedziałem, co to jest ta inicjacja... Big Grin
23-09-2011, 12:01,
#12
RE: Formularze dla edycji danych
ojtam ojtam :p
23-09-2011, 12:31,
#13
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.

Tu jest opis: http://woostuff.wordpress.com/2011/09/05...hon-logic/

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-macherSmile 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ą Smile (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ęcznySmile. Taki rodzaj inicjacji.... Smile
23-09-2011, 22:21, (Ten post był ostatnio modyfikowany: 23-09-2011, 23:08 {2} przez Rayo.)
#14
RE: Formularze dla edycji danych
Zachęcony opisem sposobu rozszerzenia funkcjonalności formularzy też postanowiłem przejść inicjację Smile
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 Smile
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


Załączone pliki
.txt   pory_roku.txt (Rozmiar: 2,98 / Pobrań: 19)
26-09-2011, 13:21,
#15
RE: Formularze dla edycji danych
Rayo jesteś wielkiSmile 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 inneSmile). Z pewnością jednak startuję od jutra i dam znać jak mi poszło.
26-09-2011, 13:29,
#16
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.)
#17
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 tyleSmile
W każdym razie robię małe kroczki naprzód Smile

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 Smile Będę musiał to przetestować na innym komputerze jeszcze.
27-09-2011, 13:49,
#18
RE: Formularze dla edycji danych
ad 2. To są zmienne wejściowe do funkcji. My wykorzystujemy tylko 'formularz', czyli nasz formularz stworzony w QT Designerze.

ad 1. 'okno' to to samo co 'formularz' 'okno=formularz'. Przypisanie jest po to, aby obiekt był widziany globalnie.

ad 3. 'u' przed łańcuchem znaków oznacza, że jest to łańcuch unicode. Tzn, że możesz w nim używać polskich znaków.
28-09-2011, 19:10,
#19
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.)
#20
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 *

okno = None
wiosna = None
lato = None
jesien = None
zima = None
miesiac = None


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")
    
    wiosna.toggled.connect(menuWiosna)
    lato.toggled.connect(menuLato)
    jesien.toggled.connect(menuJesien)
    zima.toggled.connect(menuZima)

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'])


Załączone pliki
.txt   pory_roku_funkcje.txt (Rozmiar: 1,3 / Pobrań: 13)


Podobne wątki
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
Bug Od danych punktowych przez interpolację do danych dla obszarów onkolog 7 26 810 05-07-2017, 16:51
Ostatni post: Italiano
  Zlecę napisanie skryptu dla QGIS do automatycznej edycji wielu plików SHP Matteusz 3 16 167 30-06-2017, 22:24
Ostatni post: bociusek
  Formularze i relacje fcs 0 6 105 17-05-2016, 23:31
Ostatni post: fcs
  Definicja bazy danych dla warstw fcs 0 6 911 20-12-2014, 17:09
Ostatni post: fcs
  menu 'akcje' w formularzu edycji QGIS 2.6 sebaq 0 7 811 05-11-2014, 20:56
Ostatni post: sebaq
  tryb edycji pitt 4 23 478 13-10-2010, 21:45
Ostatni post: msieczka
  Formularze QT Rayo 5 27 148 31-07-2010, 17:47
Ostatni post: Rayo
  Dostepność danych dla Polski jetron 3 21 997 28-04-2010, 09:36
Ostatni post: Odoakr

Skocz do: