R-13-01.doc

(205 KB) Pobierz
Szablon dla tlumaczy

13. Programowanie GUI za pomocą KDE/Qt

Wprowadzenie

System X Window oferuje programistom do wyboru rozliczne biblioteki widżetów. Przez długi czas dominującym zestawem narzędzi był komercyjny Motif. Motif jednakowoż nie był dostępny za darmo. Powstały nowe zestawy narzędzi, wykorzystujące zwłaszcza coraz powszechniejsze języki zorientowane obiektowo (ang. object-oriented languages). Dziś dostępnych jest mnóstwo zestawów narzędzi, a większość z nich dostępna jest nieodpłatnie. Jednym z najbardziej popularnych pakietów narzędziowych jest Qt i to jemu przyjrzymy się bliżej w tym rozdziale. Później zajmiemy się środowiskiem pulpitowym K (ang. K Desktop Environment), w skrócie KDE, zbudowanym na bazie Qt. KDE/Qt jest alternatywą GNOME/GTK+.

Od Czytelnika oczekuje się biegłej znajomości C++.

Informacje o Qt

Qt jest łatwo przenośną komponentą C++ graficznego interfejsu użytkownika GUI. Qt jest dostępny nie tylko dla Linuksa, ale również dla tuzina innych wariantów UNIX-a, a także dla Microsoft Windows. Uzyskiwanie licencji na wykorzystanie Qt oraz ocena tego, czy jest to produkt autentycznie nieodpłatny wiązało się w przeszłości z licznymi problemami. Zatem tytułem wyjaśnienia, Qt dla UNIX-a jest za darmo wtedy, gdy służy on do pisania darmowego oprogramowania z otwartym dostępem do kodu źródłowego, a kod źródłowy dla wersji UNIX-owej jest dostępny nieodpłatnie na warunkach licencji publicznej Qt QPL (ang. Qt Public License). Firma Trolltech, firmująca Qt, jest bardzo przychylna społeczności zwolenników otwartego dostępu do kodu źródłowego. Otóż, zapewniła temu środowisku na wypadek swego bankructwa korzystanie z Qt na warunkach licencji systemu operacyjnego Berkeley UNIX BSD (ang. Berkeley Software Distribution). Z ogromną społecznością wspierającą otwarty dostęp do oprogramowania KDE i Qt bezpieczna przyszłość Qt jest zapewniona. Qt z powodu swoich niejasności licencyjnych był obiektem pewnych kontrowersji. Te jednak ucichły wraz z pojawieniem się Qt 2.x, który zapoczątkował licencję QLP. Wszyscy zaniepokojeni statusem prawnym swego programu powinni przeczytać licencję, by upewnić się, czy są usatysfakcjonowani jej warunkami.

Z technicznego punktu widzenia Qt jawi się jeszcze atrakcyjniej. O jego właściwości łatwego przenoszenia (ang. portability) już wspomniano. Co więcej, ten zestaw narzędziowy jest autentycznie zorientowany obiektowo i tworzenie przy pomocy Qt komponent programowych wielokrotnego użytku przychodzi całkiem naturalnie. Qt oferuje wszystkie znane z szablonu GUI standardowe elementy interfejsu użytkownika, takie jak przyciski (ang. push buttons), listy, menu, pola wyboru (ang. check boxes). Jednak piękno Qt tkwi w łatwości tworzenia tego, czego Qt nie posiada. Specjalne, czy też przystosowane do indywidualnych potrzeb wersje dostępnych elementów interfejsu użytkownika na przykład, są niezbędne w większości aplikacji. A daje się to łatwo i naturalnie osiągnąć za pomocą Qt.

Kolejna cechą Qt jest jego obsługa dostosowanego dla potrzeb użytkownika wyglądu i działania, czy wzornictwa pulpitu (ang. themes). Ale Qt to nie tylko obsługa GUI. Umiędzynarodowienie (ang. internationalization), klasy użytkowe (ang. utility classes) takie jak listy i słowniki, klasy zarządzania plikami, klasy wyrażeń regularnych i kilka innych funkcji — to wszystko dostarczy Qt.

Jak wiadomo, doskonałość techniczna niekoniecznie oznacza sukces. Sukces Qt tkwi też w wyśmienitej dokumentacji, która rzadko pozostawia luki. A jeśli nawet nie znajdzie się tam odpowiedzi na dręczące nas pytanie, to zawsze można przyjrzeć się kodowi źródłowemu i skorzystać z bardzo przyjaznej i pomocnej listy korespondencyjnej (ang. mailing list).

Informacje o KDE

KDE jest potężnym, bezpłatnym pulpitem dla UNIX-a, z otwartym dostępem do kodu źródłowego. KDE, podobnie jak wiele innych programów z otwartym dostępem do kodu źródłowego jest projektem internetowym, którego twórcy rozproszeni są po całym świecie. Pomysł zrodził się na skutek tego, że jeden programista, Matthias Ettrich, zaproponował nieodpłatne środowisko pulpitowe dla Linuksa. Propozycja pojawiła się wkrótce po tym, jak Trolltech wydał pierwszą wersję Qt. Ettrich przyjrzał się bibliotece Qt i zaproponował jej wykorzystanie ze względu na jej wysoką jakość i przyjazną, otwartą formę licencji. To doprowadziło w październiku 1996 roku do utworzenia KDE. Nazwa KDE jest skrótem od K Desktop Environment (środowisko pulpitowe K), przy czym „K” nie znaczy nic. Obecnie kilkuset programistów i ponad stu tłumaczy bierze udział w projekcie KDE.

KDE jest interesujący zarówno dla programistów jak i użytkowników. Użytkownikom odpowiada zapewne to, że KDE wymusza spójność (ang. consistency) między aplikacjami. Użytkownik w znacznym stopniu może centralnie kierować ustawieniami wyglądu aplikacji KDE. Programistom natomiast, KDE oferuje szereg klas, ułatwiających tworzenie aplikacji. Wraz z nową edycją KDE 2 współdziałanie pomiędzy aplikacjami i ich powtórne wykorzystanie stanie się łatwiejsze, co stworzy jeszcze potężniejszy i bardziej zintegrowany pulpit.

W tym rozdziale omówimy następujące zagadnienia:

q       Instalacja Qt i KDE.

q       Użycie tmake ułatwiające tworzenie i zarządzanie plikiem Makefile.

q       Utworzenie prostej aplikacji Qt.

q       Koncepcja sygnału i szczeliny.

q       Tworzenie widżetów.

q       Rozmieszczenie widżetów.

q       Klasy użytkowe Qt.

q       Wstęp do programowania KDE: prosty edytor tekstowy.

Instalacja Qt

Kod źródłowy dla Qt może być pobrany pod adresem internetowym: ftp://ftp.trolltech.com/qt/source/. Pakiety do zainstalowania, na przykład w formacie RPM, odnaleźć można pod adresem ftp://ftp.trolltech.com/qt/dist/, lub w witrynie internetowej wersji dystrybucyjnej używanego Linuksa. Tutaj omówiona zostanie instalacja Qt z upakowanego archiwum (ang. tarball archive) z kodem źródłowym. W tymże archiwum znajduje się plik INSTALL, opisujący w każdym, najdrobniejszym szczególe sposób instalacji Qt. A podstawowa procedura instalacyjna, skuteczna dla większości systemów, przedstawia się następująco.

Zalecanym katalogiem do umieszczenia Qt jest /usr/local, ale kwestia lokalizacji jest sprawą najzupełniej dowolną. Przykładowo, Qt w dystrybucjach SuSE może być odnalezione w /usr/lib/qt. Tutaj zakładamy lokalizację /usr/local:

 

$ cd /usr/local

 

Należy najpierw rozpakować archiwum, używając metody podobnej do poniższej:

 

$ tar –xvzf qt-x11-2.1.1.tar.gz

 

Utworzenie dowiązania (ang. link) do katalogu Qt umożliwi instalację wielu wersji Qt:

 

$ln –s /usr/local/qt-2.2.1.1 /usr/local/qt

 

Qt potrzebuje dwóch zmiennych środowiskowych:

 

QTDIR=/usr/local/qt

PATH=$QTDIR/bin:$PATH

 

Uaktualnienie ścieżki jest niezbędne do poinformowania powłoki systemowej o lokalizacji kompilatora Qt metaobiektów (o którym nieco później). Zmienne środowiskowe należy umieścić w pliku konfiguracyjnym używanej powłoki systemowej, na przykład dla powłoki bash w pliku .bash_profile, który znajduje się w  katalogu macierzystym. Plik INSTALL zawiera wyczerpujące wyjaśnienia dotyczące innych powłok. Jeśli zmienna QTDIR zostanie tylko umieszczona w pliku konfiguracyjnym powłoki systemowej, to należy ponownie uruchomić powłokę (to znaczy wyrejestrować się i ponownie zarejestrować w systemie). Można też wykonać następujące polecenie:

 

$ export QTDIR=usr/local/qt

 

w celu ustawienia zmiennej w bieżącym środowisku powłoki. Na tym etapie Qt jest przygotowany do skompilowanie. Obejrzenie listy opcji kompilacji umożliwi polecenie:

 

$ ./configure –help

 

W domyślnych ustawieniach dla kompilacji brak jest obsługi JPEG i GIF. Aby dołączyć ich obsługę należy wpisać:

 

$ ./configure –system-jpeg –gif

 

Jeśli odpowiadają nam ustawienia domyślne, które można zobaczyć używając parametru –help, wystarczy wpisać:

 

$ ./configure

 

Może się wyjątkowo pojawić potrzeba określenia platformy, dla której dokonuje się kompilacji. Robi się to tak:

 

$ .configure –platform linux-g++

 

To spowoduje utworzenie plików makefile dla biblioteki i wszystkich przykładów. Wystarczy wpisać:

 

$ make

 

by skompilować wszystko. Nie ma make install. Teraz należy dodać następujący wiersz do /etc/ld.so.conf:

 

/usr/local/qt/lib

 

Zarejestruj się w systemie jako użytkownik root i uruchom:

 

# ldconfig

 

I to wszystko. Jeśli pojawią się problemy, pomocny może się okazać plik INSTALL lub lista FAQ (często zadawanych pytań i odpowiedzi) na temat instalacji. W materiałach źródłowych przy końcu tego rozdziału znaleźć można adresy odpowiednich stron WWW.

Instalacja KDE

Będziemy korzystać z najnowszej wersji KDE, czyli z KDE 2. KDE jest bardzo duży, a więc pobranie go nie dla każdego użytkownika może okazać się praktyczne. Zamiast pobierać go w całości zalecana jest jego instalacja jako części dystrybucji Linuksa. Nie powinno to stanowić problemu, gdyż KDE dołączany jest niemal do wszystkich dystrybucji Linuksa. Jeśli jednak zajdzie potrzeba pobrania KDE należy dostosować się do aktualnych instrukcji instalacji podanych w witrynie WWW http://www.kde.org/.

Biblioteki

Qt posiada różnorodne rozszerzenia, a KDE liczne biblioteki. Tutaj skoncentrujemy się na czterech bibliotekach centralnych. Zapoznanie się z nimi przyda się i znacznie ułatwi poszerzanie aplikacji o nowe, dodatkowe biblioteki.

 

Biblioteka

Opis

libqt

Qt składa się z jednej biblioteki libqt. Istnieja rozszerzenia Qt w oddzielnych bibliotekach, ale je pominiemy.

libkdecore

Wszystkie programy KDE używają tej biblioteki. Zapewnia ona podstawowy zestaw funkcji, jak np. system konfiguracji i umiędzynarodowienie.

libkdeui

Ta biblioteka zawiera większość elementów interfejsu użytkownika, dostarczanych przez KDE.

libkfile

Ta biblioteka dostarcza wielu klas do operacji na plikach, takich jak dialogi otwierania i zapisywania plików, podglądu plików (np. by pokazać podgląd pliku w postaci miniaturowego obrazka) w dialogu otwierania pliku.

Programowanie aplikacji przy użyciu Qt

Programiści mają do dyspozycji kilka narzędzi do skonstruowania interfejsu graficznego GUI za pomocą KDE/Qt. Jest nim choćby Qt Architect, albo QtEZ, czy też KDE Studio (wszystkie łącza do informacji na ich temat są podane w podrozdziale z materiałami źródłowymi). Nasz pierwszy interfejs GUI będzie napisany samodzielnie, bez ich pomocy. Są ku temu dwa powody. Po pierwsze, interfejs GUI Qt jest bardzo łatwy do odręcznego napisania. Po drugie, to nie wyręczanie się generatorem GUI (ang. GUI builder), ale bezpośrednie użycie Qt jest najlepszą metodą nauki programowania z jego użyciem. Jest rzeczą przydatną wiedzieć, co właściwie dzieje się podczas konstrukcji GUI, aby można było, gdy narzędzia nie mogą sprostać zadaniu, rozszerzyć swój kod samodzielnie.

Czytelnik powinien, do czego zachęcamy, sięgnąć po podręcznik Qt, by dokładnie zapoznać się z możliwościami klas, które tutaj zostaną użyte.

Na początek: Witaj świecie

Zaczniemy od omówienia pojęciowego Qt i utworzymy graficzny program „Witaj świecie”. Następnie rozszerzymy go nieco, zanim przyjrzymy się uważniej Qt. Nasz program będzie składał się z pojedynczego przycisku (ang. push button) z przewidywalnym opisem. Zatem do dzieła!

 

#include <qapplication.h>

#include <qpushbutton.h>

 

int main(int argc, char **argv)

{

   QApplication app(argc, argv);

   QPushButton button("Witaj swiecie", 0);

   app.setMainWidget (&button);

   button.show();

   return app.exec();

}

 

I to by było na tyle! Trudno o coś krótszego niż to. Teraz kompilujemy i uruchamiamy:

 

$ g++ -c –I$QTDIR/include main.cpp

$ g++ -o witajswiecie main.o –L$QTDIR/lib –lqt

$ ./witajswiecie

 

Obiekt QApplication rozpoznaje kilka opcji. By zapoznać się z pełną listą możliwych opcji należy sięgnąć po właściwą dokumentację dla klasy QApplication . Tutaj przedstawimy tylko jeden argument –style. Spróbuj jeszcze uruchomić witajswiecie, określając obsługiwany przez Qt styl (Motif jest ustawiony domyślnie) — jeden z dwóch pozostałych do wyboru: Windows i Platinum:

 

$ ./witajswiecie –style=platinum

 

i

 

$ ./witajswiecie –style=windows

 

Nawiasem mówiąc, Platinum jest nazwą używaną przez Apple do opisu wyglądu i działania systemu operacyjnego MacOS. Poniżej znajdują się zrzuty ekranu dla trzech różnych stylów. Przycisk jest pojedynczy, toteż różnice w wyglądzie przycisku w zależności od zastosowanego stylu, są bardzo nieznaczne. Najlepiej są one widoczne w  kształcie i stylu wyprofilowanych ukośnie krawędzi (ang. bevel) wokół przycisku. Argument style może być dodany do każdego programu Qt. Jeśli aplikacja jednoznacznie nie wymusza wyglądu, ten argument zmieni styl całej aplikacji.

 

Styl

Wynik

Motif (domyślnie)

Zrzut przycisku I (str.454)

 

Platinum

Zrzut przycisku II (str.454)

 

Window

Zrzut przycisku III (str.454)

 

 

Przyjrzyjmy się uważniej kodowi:

 

#include <qapplication.h>

#include <qpushbutton.h>

 

Najpierw dołączamy niezbędne pliki. Zamierzamy użyć tylko dwóch klas QApplication i QPushButton, a więc to wszystko czego nam trzeba.

 

QApplication app(argc, argv);

 

Argumenty wiersza poleceń są przekazywane do konstruktora QApplication, by umożliwić mu rozpoznanie, na przykład, argumentu –style. Klasa QApplication zajmuje się rozpoczęciem i zakończeniem aplikacji, strumieniem sterowania (ang. control flow) oraz głównymi ustawieniami aplikacji. Qt dostarcza wielu klas użytkowych, jak również rozszerzenia sieciowego (ang. networking extension). Jest więc możliwe opracowanie z pomocą Qt aplikacji innego typu niż GUI. W takim przypadku nie jest potrzebny obiekt QApplication. Choć zazwyczaj obiekt QApplication występuje, to jednak nie jest to klasa zbyt często wykorzystywana poza przypadkami jej użycia na samym początkiem aplikacji, jak to pokazano powyżej. Zazwyczaj kilka powyższych wierszy jest wszystkim, co należy wiedzieć o QApplication.

 

QPushButton button("Witaj swiecie", 0);

 

W ten sposób tworzy się przycisk. Pierwszy argument jest opisem (ang. caption) przycisku, a drugi argument jest tak zwanym obiektem macierzystym (ang. parent) przycisku. Do kwestii „rodzicielstwa” jeszcze powrócimy. Na razie postarajmy zadowolić się stwierdzeniem, że wszystkie widżety w Qt mają widżet macierzysty. Wyjątkiem są okna najwyższego poziomu (ang. top-level windows), które zgodnie z konwencją mają okno główne (ang. root window) jako swój widżet macierzysty. Okna najwyższego poziomu są tworzone poprzez przekazanie wskaźnika pustego (ang null pointer) jako obiekt macierzysty.

 

app.setMainWidget(&button);

 

Określamy dla obiektu aplikacji główny widżet tej aplikacji. Główny widżet pełni szczególną rolę — jeśli jest zamknięty, wówczas aplikacja zakończy się.

 

...

Zgłoś jeśli naruszono regulamin