Forum QGIS

Pełna wersja: Formularze dla edycji danych
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3 4
Witam
Chciałbym się zapytać, czy ktoś już przerabiał temat tworzenia formularzy do łatwej edycji danych tzn. mamy sobie jakąś warstwę np. drogi, która ma kilka pól i chciałbym mieć możliwość łatwego wprowadzania atrybutów tej warstwy tzn. klikam w dany odcinek drogi wyskakuje mi okienko gdzie mogę łatwo wypełnić atrybuty wybierając np. z listy rozwijanej typ drogi (utwardzona, polna), rodzaj nawierzchni, szerokość drogi itd. Oczywiście dobrze by było żeby już wprowadzone atrybuty pokazywały się w takim formularzu.
Czy trzeba do tego tworzyć odrębną wtyczkę w Pythonie (jakieś przykłady kodu) czy też jest jakiś prostszy sposób?

Pozdrawiam Paweł
Problem mam podobny choć może trochę bardziej złożony, dlatego przyklejam sie do tego wątku. Mam warstwę pobieraną z PostGIS. Zrobiłem do niej formularz w QT Designerze i wszystko działa całkiem fajnie choć nie do końca tak jakbym chciał. Czy zna ktoś metodę ustawiania walidacji wprowadzanych danych po stronie aplikacji? W bazie danych mam pewne ograniczenia i w najgorszym wypadku wypełniony formularz nie zostanie w bazie zapisany, a użytkownik zobaczy komunikat o błędzie (wypełnianie formularza troche trwa więc może to być irytujące na dłuższą metę). Interesuje mnie możliwość blokowania niektórych pół w formularzu w momencie kiedy wybiorę odpowiednią opcję z jednego z ComboBoxów. Aktualnie wszystkie dane (stałe wartości z ComboBox) pojawiające się w formularzu pobierane są ze słowników. Może można je jakoś dodać na stałe do formularza albo wykorzystać Radio Buttony?... Tylko nie bardzo wiem jak to zrobić. Może jakieś pomysły?
Trochę o formularzach jest tu http://my.opera.com/p0cisk/blog/show.dml/32147412

Co prawda nie ma tam rozwiązania problemu bardziej zaawansowanych formularzy, ale może się przyda.
Witam
O walidacji wprowadzanych danych można poczytać tutaj (With Python validation and custom logic).
Generalnie trzeba stworzyć skrypt pythona, za pomocą którego sprawdzane będą wprowadzone wartości, i zapisać go w katalogu z plikiem projektu.
Osobiście nie testowałem tego sposobu.
W celu ukrywania lub czyszczenia odpowiednich pól w formularzu można też wykorzystać sygnały i sloty w QT Designerze.
W formularzu dodajesz np. Radio Button i Line Edit, a następnie przechodzisz do trybu Modyfikuj sygnały/sloty. Przeciągasz Radio Button na Line Edit i ustawiasz co się ma stać, np. po lewej wybierasz toggled(bool) a po prawej clear(). W wyniku takich ustawień przełączenie Radio Buttona spowoduje wyczyszczenie pola Line Edit. Można zastosować różne kombinacje.
Wracając jeszcze do pierwszego pytania w tym wątku.
Swat, jeśli nie potrzebujesz jakiegoś specjalnego formularza, a jedynie listę wartości dla danego pola to wystarczy, że wejdziesz we Właściwości warstwy/Pola i dla interesującego Cię pola ustawisz rodzaj edytora na Mapa wartości. W oknie, które się pokaże, wpisujesz wszystkie możliwe do wybrania wartości i klikasz OK.
Od tego momentu edytując to pole będziesz miał widoczną listę wyboru z wpisanymi przez Ciebie wartościami.
Dzięki Wam zrobiłem sporo postępów w moich pracachSmile Doszedłem do tego jak przez Radio Button włączać i wyłączać poszczególne pola i robić z nimi jeszcze inne cuda. To jest prostsze niż myślałem choć brakuje mi jeszcze kilku rzeczy jak na przykład dodawanie jakiś akcji ( jest tu nawet taka opcja ale kompletnie nie wiem ja z tego korzystać). Ale interesuje mnie jeszcze jedna możliwość. Czy zaznaczając Radio Button mogę jego nazwę (text) wyświetlić w polu Label albo albo text edit? Tak naprawdę to jakie pola na moim formularzu będą aktywne zależy od jednej z czterech opcji. Wymyśliłem takie coś, że jedną z tych opcji będzie można wybrać przez Radio Button (to warunkowało by które pola w pozostałej części formularza będą aktywne). Jeśli mógłbym ten wybór przenieść do pola Text Edit to mógłbym od razu wprowadzić taką daną do bazy. W najgorszym wypadku będę musiał zastosować rozwiązanie gdzie użytkownik będzie musiał wybrać z Combo Box odpowiednią opcję a potem jeszcze pamiętać o zaznaczeniu Radio Button żeby wiedzieć, które dane może wprowadzić... Słabo to wygląda Smile Ponieważ nie jestem biegły (czytaj nie znam się w ogóle) w Pythonie to Qt Designer ze swoją prostotą jest dla mnie wymarzonym narzędziem dlatego chciałbym uniknąć pisania skryptów.
(14-09-2011, 23:12)brylu napisał(a): [ -> ]Czy zaznaczając Radio Button mogę jego nazwę (text) wyświetlić w polu Label albo albo text edit? Tak naprawdę to jakie pola na moim formularzu będą aktywne zależy od jednej z czterech opcji. Wymyśliłem takie coś, że jedną z tych opcji będzie można wybrać przez Radio Button (to warunkowało by które pola w pozostałej części formularza będą aktywne). Jeśli mógłbym ten wybór przenieść do pola Text Edit to mógłbym od razu wprowadzić taką daną do bazy.

Nie wiem czy da się zrobić tak jak piszesz w prosty sposób, ale może poniższe rozwiązanie będzie dobre. Warunkiem jest zmiana RadioButtonów na CheckBoxy (dla RadioButtonów nie udało mi się tego uruchomić).
CheckBoxa możesz powiązać bezpośrednio z tabelą atrybutów. Po prostu nadaj mu nazwę jednej z kolumn, np. 'Kolor'. Jeżeli użytkownik ma wybierać pomiędzy dwoma kolorami (np. CheckBox wybrany = 'Czerwony'/CheckBox nie wybrany = 'Zielony') to można to ustawić we Właściwościach warstwy w karcie Pola. Dla pola 'Kolor' ustaw rodzaj edytora na Pole wyboru i wstaw wartości 'Czerwony', 'Zielony'.
Rozwiązanie bardzo fajne i z pewnością do wykorzystania ale daje tylko dwie możliwości Check Box włączony/wyłączony... Ja potrzebuję czterechSad Idealną rzeczą było by dodanie akcji która ustalała by wartość właściwości jednego elementu w zależności od tego co dzieje się z drugim elementem. W Qt Designerze jest takie coś jak edytor akcji ale zdaje się, że te akcje to mają być oddzielne pliki z kodem... Pogrzebię w tym jeszcze trochę ale mam wrażenie, że będę musiał szukać innych rozwiązań. W każdym razie dziękuję wszystkim za pomoc Smile
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.
Stron: 1 2 3 4