W tej samej skórze

wxWindows i Qt to dwa rozwiązania, umożliwiające tworzenie aplikacji identycznie wyglądających na wielu platformach.

wxWindows i Qt to dwa rozwiązania, umożliwiające tworzenie aplikacji identycznie wyglądających na wielu platformach.

Dla programisty pisanie przenośnych aplikacji jest dużym wyzwaniem. W przypadku języków przetwarzanych przez specjalne maszyny wirtualne (np. Java) problem teoretycznie nie istnieje. W praktyce, niestety, trzeba zwracać uwagę na to, by dany kod każda z maszyn wirtualnych przetwarzała tak samo. Jednak nadal wiele programów powstaje w C/C++, gdzie konieczne staje się pisanie aplikacji w taki sposób, by uwzględniały różnice pomiędzy poszczególnymi platformami czy systemami operacyjnymi.

Jeżeli tworzona aplikacja ma wyraźnie wyodrębnione elementy odpowiedzialne za przetwarzanie danych i interfejs użytkownika, to główna trudność sprowadza się do przeniesienia części odpowiedzialnej za interfejs. Napisanie przenośnej części obliczeniowej wymaga tylko nieznacznych zmian.

W przypadku obsługi interfejsu problemy dotyczą nawet aplikacji działających w trybie tekstowym. W aplikacjach korzystających z GUI kłopoty wynikają z faktu, że w zasadzie każdy system (zarówno X Window, SGI czy Microsoft Windows) opiera się na innej filozofii i operuje na innym zestawie funkcji API. Przy tworzeniu aplikacji wieloplatformowej może się okazać, że trzeba pisać od początku te fragmenty, które w jakikolwiek sposób wykorzystują konkretny system okienkowy.

Warstwa pośrednia

Pojawiło się wiele rozwiązań, które tworzą pewnego rodzaju warstwę pośrednią między konkretnym systemem okienkowym a aplikacją. Dzięki temu program tworzony jest przy użyciu specjalnej biblioteki np. QT i potem może zostać skompilowany na każdej platformie, na której QT została zaimplementowana. Tego typu rozwiązania mają kilka zalet. Pozwalają oddzielić warstwę prezentacji od konkretnej implementacji systemu okienkowego, a ponadto zapewniają programiście spójne ramy (tzw. framework), które ułatwiają tworzenie aplikacji (zwykle dodatkowo dostępne są narzędzia do graficznego tworzenia interfejsu). Wady - niestety, jak w każdej warstwie pośredniej - to spowalnianie aplikacji i zwiększenie wymagań pamięciowych. Inny problem wynika z tego, że w rzeczywistości aplikacja wygląda inaczej w różnych systemach i, by była w pełni przenośna, konieczne jest dobre rozplanowanie poszczególnych elementów graficznych, np. proporcji między różnymi elementami.

Jednym z takich rozwiązań jest wxWindows. Nie jest to pakiet, który zapewnia pełną przenośność interfejsu między systemami. Czasami zdarza się, że nie można skompilować pod Microsoft Windows kodu współpracującego z Motif, ale w większości przypadków jest to możliwe.

wxWindows zapewnia rozbudowane ramy do tworzenia aplikacji. Jest to zbiór klas C++, które dostarczają pełną funkcjonalność GUI, wirtualny system plików, narzędzia do komunikacji za pośrednictwem gniazdek TCP/IP i obsługę wątków. Równocześnie zawiera podstawowe struktury danych (tablice, listy, tablice haszujące itp.). W wxWindows zawarty jest przenośny zbiór klas obsługujących interfejs ODBC (dostęp do relacyjnych baz danych). Pełny pakiet w wersji 2.2 zawiera ponad 400 klas.

Ciekawie została rozwiązana konstrukcja biblioteki, a zwłaszcza mechanizm przekazywania zdarzeń. Większość bibliotek GUI stosuje mechanizm obsługi zdarzeń do współpracy z użytkownikiem. Zdarzenie jest "wyzwalane" w momencie np. kliknięcia przycisku na oknie dialogowym, a następnie przekazywane do konkretnej funkcji w programie, gdzie zawarta jest obsługa danego przycisku. Zwykle pakiety graficzne opierają się na tzw. mechanizmie callback - w podsystemie okienkowym rejestruje się specjalną funkcję, wywoływaną przez wskaźnik w momencie wystąpienia zdarzenia. Następnie funkcja ta przekazuje sterowanie do właściwego miejsca w programie (obsługującego naciśnięcie danego przycisku).

wxWindows ukrywa przed programistą właściwe mechanizmy callback. Pozwala natomiast na tworzenie tzw. map komunikatów, w których konkretnemu zdarzeniu przyporządkowuje określoną funkcję. Duża część zdarzeń jest obsługiwana "domyślnie" i wtedy np. dodanie własnego kodu uruchamianego w momencie przesuwania okna wymaga tylko utworzenia implementacji danej funkcji wirtualnej. Jest to mechanizm bardzo zbliżony do tego, który jest stosowany w MFC, ale wxWindows zawiera znacznie bardziej rozbudowane mechanizmy operacji na "tablicach" komunikatów - można je dynamicznie wymieniać itp.

wxWindows stał się podstawą pakietów do tworzenia interfejsu w językach skryptowych, takich jak Perl czy Python. Biblioteki wxPerl i wxPython są dosyć szeroko stosowane, ponieważ pozwalają niemal bez problemu uruchamiać aplikacje z interfejsem użytkownika na różnych platformach.

Do wxWindows dostępne są komercyjne narzędzia typu RAD. Dobrym przykładem jest wxDesigner. Jest to pakiet, który zawiera edytor okien dialogowych, kreatory kodu i wiele innych udogodnień. Generowane pliki mogą być dostosowywane do współpracy z C++, a także z wxPython czy wxPerl (wxDesigner tworzy np. definicję okna dialogowego w postaci specjalnego pliku XML, a następnie jest on przekształcany w kod w "wyjściowym" języku).

Dla wxPython powstało także inne narzędzie typu RAD - Boa Constructor. Pakiet open source, na razie w wersji testowej, przypomina Delphi. Zawiera zintegrowany debugger, narzędzie do tworzenia formatek i "klikanego" podłączania procedur obsługi zdarzeń itp. Jeżeli będzie nadal rozwijany, może być ciekawym narzędziem dla programistów przyzwyczajonych do narzędzi RAD, dostępnych dla Microsoft Windows.

wxWindows jest dostępny na zasadach open source, na licencji GNU Library General Public License w wersji 2. Dostępne są też wersje działające na większości odmian Unixa i Linuxa, na Windows, a także wersja testowa dla Mac OS.

Takie same okna

Drugim, godnym uwagi pakietem do tworzenia przenośnych aplikacji jest Qt firmy Trolltech (z biblioteki Qt ma korzystać Kylix Borlanda). Warto wyjaśnić zasady licencjonowania tego pakietu. Dostępne są trzy wersje - bezpłatna i dwie komercyjne. Qt Free Edition pozwala tworzyć bezpłatne aplikacje dla Unix/X11. Aby legalnie sprzedawać aplikacje, należy zakupić licencję Professional albo Enterprise. Licencje developerskie kosztują odpowiednio ok. 1500 i 2000 USD.

Qt także dostarcza warstwę pośrednią pomiędzy GUI a tworzoną aplikacją (X Window Qt odwołuje się bezpośrednio do Xlib i nie korzysta z Motif). Z tym, że w odróżnieniu od wxWindows, zawiera bardzo prosty mechanizm tworzenia dodatkowych elementów GUI. W Qt można dodać własne tzw. widgets, czyli kontrolki realizujące określone zadania (fantazyjny przycisk czy wyrafinowana lista wyboru). Dzięki tym elementom GUI na wszystkich platformach wygląda podobnie. Program może korzystać z takich samych mechanizmów na każdym systemie operacyjnym, na który zostało przeniesione Qt. Jednocześnie przy wymianie zestawu widget istnieje możliwość dynamicznej zmiany "wyglądu" aplikacji, np. można na X Window uruchomić aplikację do złudzenia przypominającą wyglądem programy z Windows 95.

Podobnie jak wxWindows, Qt ma duży zbiór klas i funkcji usługowych (obsługę kolekcji, urządzeń I/O itp.). Wersja Enterprise zawiera moduły obsługi OpenGL, interfejsów sieciowych (w tym komunikację z wykorzystaniem gniazd i gotowe klasy obsługujące DNS/FTP/ TCP), zaawansowany moduł do tworzenia grafiki dwuwymiarowej i wykresów, a także specjalny widget przypominający arkusz kalkulacyjny. Warto dodać, że w Qt 2.3 są dostępne biblioteki parsera XML (zarówno dostosowane do interfejsu SAX, jak i DOM Level 1). Do pakietu dodany jest Qt Designer, który pozwala graficznie tworzyć okna dialogowe i planować rozmieszczenie poszczególnych elementów.

W Qt inaczej są przekazywane zdarzenia pomiędzy GUI a aplikacją. Programista nie tworzy map komunikatów, ale dynamicznie wiąże ze sobą obiekty tzw. mechanizmem signal-slot. Obiekt slot "dołącza się" do sygnału zgłaszanego przez inny i w ten sposób "przechwytuje" zdarzenie. Z tym, że zdarzeniem może być zarówno kliknięcie na przycisk, jak i wystąpienie przepełnienia numerycznego w trakcie obliczeń. Warto podkreślić, że właśnie zastosowanie tego mechanizmu sprawia, iż w Qt tak łatwo można tworzyć komponenty (widgets). Każda klasa, która dziedziczy obiekt, może zawierać sloty lub sygnały. Slot to funkcja - element klasy, który jest wywoływany w momencie zajścia zdarzenia. Sygnał jest wysyłany przy użyciu specjalnego słowa kluczowego. Wymaga to, by kod programu korzystający z Qt był wstępnie przetwarzany przez parser generujący kod, który można skompilować w C++.

--------------------------------------------------------------------------------

Dodatkowe informacje:

wxWindows:http://www.wxwindows.org

Qt: http://www.trolltech.com

W celu komercyjnej reprodukcji treści Computerworld należy zakupić licencję. Skontaktuj się z naszym partnerem, YGS Group, pod adresem [email protected]

TOP 200