180 likes | 306 Views
Wykorzystanie mechanizmu delegata do emulacji struktury i zachowania widżetów w architekturze Model/Widok biblioteki Qt4. Piotr Małek Filip Piechocki. Przesłanki do powstania pracy. Wzrost znaczenia warstwy prezentacyjnej w współczesnych aplikacjach Powszechność użycia widoków
E N D
Wykorzystanie mechanizmu delegata do emulacji struktury i zachowania widżetów w architekturze Model/Widok biblioteki Qt4 Piotr Małek Filip Piechocki
Przesłanki do powstania pracy • Wzrost znaczenia warstwy prezentacyjnej w współczesnych aplikacjach • Powszechność użycia widoków • Wygoda i uniwersalność architektury Model/Widok
Architektura Model/Widok • Model – interfejs dla danych • Widok – obiekt ekranowy do prezentacji danych uzyskanych z modelu • Delegat – wykorzystywany przez widok do wyświetlania i edycji pojedynczego elementu
Wymagania projektowe • Zgodność z koncepcją architektury Model/Widok • Uniwersalność (rozwiązanie musi działać dla dowolnych typów widżetów) • Wydajność umożliwiająca wygodne działanie z ilością obiektów ekranowych rzędu kilkuset.
Próby rozwiązania • Ręczna kontrola położenia widżetów w widoku • Odrysowywanie widżetów • Pseudo-widżety • System meta-obiektów • Rozwiązanie finalne
Ręczna kontrola położenia widżetów • Pomysł • Widżety ustawiane „na” widoku • Realizacja • W miejscu przeznaczonym przez widok dla reprezentacji danego elementu ustawiamy widżet • Reagujemy na zdarzenia przewijania widoku i w zależności od tego przemieszczamy widżety na właściwe miejsce • Wady i zalety + Bardzo proste w implementacji + Gotowa, natywna dla widżetów, obsługa zdarzeń + Rozwiązanie uniwersalne - Widżety nie są związane z widokiem - Słaba wydajność
Odrysowywanie widżetów • Pomysł • Widżet nie wysyłający zdarzeń mniej obciąża aplikację • Odrysowywanie widżetu, zamiast jego pozycjonowania • Realizacja • Ustawienie setVisible(false) • Użycie metody render() widżetu • Wady i zalety + Widżet jest integralną częścią widoku + Rozwiązanie uniwersalne - Brak obsługi zdarzeń
Pseudo-widżety • Pomysł • Stworzyć dedykowane pseudo-widżety specjalnie na potrzeby projektu • Realizacja • Wykorzystanie klasy QStyle • Wady i zalety + Wysoka wydajność - Brak obsługi zdarzeń - Trudne w implementacji - Obsługa tylko standardowych kontrolek
System meta-obiektów • Pomysł • Ograniczenie liczby widżetów do minimum • Realizacja • Wykorzystanie render() • Tylko jeden prawdziwy widżet-wzorzec • Odrysowanie widżetu, po uprzednim zainicjowaniu go wartościami przechowywanymi w modelu pośredniczącym • Wady i zalety + Rozwiązanie uniwersalne - Bardzo wolne
Rozwiązanie finalne • Ponownie odrysowywanie widżetów • Qt::WA_DontShowOnScreen • Model pośredniczący • Zalety – dowolne widżety, animacje • Wady – prawdziwe widżety, problemy z obsługą zdarzeń
Klasy część 1 • WoivAbstractWidgetWrapper • Klasa opakowująca normalną kontrolkę • Do zaimplementowania przez użytkownika • Realizuje dwustronne połączenie danych modelu z odpowiadającymi im danymi odpowiednich kontrolek • WoivAbstractWidgetFactory • Fabryka widżetów, służących do reprezentacji danych modelu • Zwraca obiekt pochodny do WoivAbstractWidgetWrapper • Do samodzielnego zaimplementowania przez użytkownika
Klasy część 2 • WoivAbstractProxyModel • Klasa przechowująca dane do prezentacji indeksów modelu • Powiązana bardziej z widokiem niż z modelem • Odwzorowuje strukturę modelu i przechowuje w niej widżety służące do prezentacji
Klasy część 3 • WoivController • Przekazywanie zdarzeń z widoku do odpowiedniego widżetu • Odrysowywanie widżetów w widoku
Projekt • Diagram klas
Projekt • Architektura
Testowanie • Napisanie prostej aplikacji wykorzystującej nasze rozwiązanie
Testowanie • Użycie narzędzi callgrindi KCacheGrinddo znalezienia „wąskich gardeł” i sprawdzania zmian wydajności po wprowadzeniu poprawek • Wykorzystanie QTestLib do testowania wydajności wprowadzanych poprawek
Koniec • Prosimy o łatwe pytania !!!!!