Biblioteka QT Autor Jarosaw Hryciuk j hryciukstudents mimuw
Biblioteka QT Autor: Jarosław Hryciuk j. hryciuk@students. mimuw. edu. pl
Plan prezentacji: l Twórcy l Zastosowania l Licencja l Rozszerzenia C++: Qt Object Model l Co może biblioteka Qt
Twórcy biblioteki: Trolltech l Firma norweska l Główny produkt: Qt l Qtopia
Zastosowania l Mnóstwo udanych, komercyjnych produktów opartych na Qt l Środowisko KDE pod X Windows System l Mnóstwo różnorakiego oprogramowania użytkowego na licencji GPL pod X 11.
Licencja l Wersja GPL tylko na platformy Unix/X 11, Macintosh, Linux/embedded. l Wersja komercyjna także na platformę Windows 32 bit.
Przenaszalność l Wersje dla różnych systemów operacyjnych l Niezależny od kompilatora; rozszerzenia języka są oparte na Meta Object System, a nie na rozszerzeniach konkretnego kompilatora
Qt Object System l Sygnały i sloty l Własności obiektów l QString – internacjonalizacja napisów. l Zdarzenia i filtry zdarzeń l Drzewa obiektów, porzucanie obiektów l Strzeżone wskaźniki
Sygnały i sloty Funkcja: komunikacja między obiektami QOBJECT l Wygodne przy tworzeniu interfejsów graficznych l Sygnał podłączany do slotu l Relacja wiele-dowielu. l
Sygnały i sloty class Foo : public QObject { Q_OBJECT public: Foo(); int value() const { return val; } public slots: void set. Value( int ); signals: void value. Changed( int ); private: int val; }; Makrodefinicja potrzebna do MOC void Foo: : set. Value( int v ) { if ( v != val ) { val = v; emit value. Changed(v); } } Foo a, b; connect(&a, SIGNAL(value. Changed(int)), &b, SLOT(set. Value(int))); b. set. Value( 11 ); // a == undefined b == 11 a. set. Value( 79 ); // a == 79 b. value(); // returns 79
Sygnały i sloty: dlaczego? l l l Zróżnicowana obsługa zaawansowanych opcji szablonów w różnych kompilatorach. Problem z częściowym instancjonowaniem szablonów. Przejrzystość kodu, łatwa intuicja pomagająca zrozumieć istotę działania. Zamiast rozszerzanych kompilatorów, specyficznych IDE, mamy MOC (meta object compiler) produkujący standardowy kod C++ kompilowalny na każdym kompilatorze.
Sygnały i sloty vs. „callback” Zalety: l Wygodniejsze w użyciu. l Bezpieczne pod względem typów (type safe) – tylko sygnał zgodny z typem slotu może zostać do niego podłączony. l Projektując slot/sygnał nie musimy wiedzieć jak zostanie podłączony. Pełna abstrakcja i modularyzacja. Wady: l Około 10 x wolniejsze niż „tradycyjne” callback.
QString l Klasa do reprezentacji napisów. l Wewnętrzny sposób kodowania: unicode. l Używamy tr() do tekstów widocznych dla użytkownika: Login. Widget: : Login. Widget() { QLabel *label = new QLabel( tr("Password: "), this ); . . . } Używanie tr() w całej aplikacji gwarantuje właściwe kodowanie napisów.
QString l Parametryzowane QString q. Debug( napisy: s 1 = "%1 of %2 files copied. Copying: %3"; s 2 = "Kopierer nu %3. Av totalt %2 filer er %1 kopiert. "; s 1. arg(5). arg(10). arg("somefile. txt"). ascii() ); s 2. arg(5). arg(10). arg("somefile. txt"). ascii() ); 5 of 10 files copied. Copying: somefile. txt Kopierer nu somefile. txt. Av totalt 10 filer er 5 kopiert.
Zdarzenia i filtry zdarzeń l Zdarzenie to klasa, która dziedziczy po QEvent. l QResize. Event, QPaint. Event, QKey. Event, QTimer. Event, QMouse. Event etc. l Mechanizm filtrowania zdarzeń.
Filtrowanie zdarzeń l Pozwala na przechwytywanie i filtrowanie zdarzeń adresowanych do innych obiektów. l Wygodne przy tworzeniu GUI, np. okienka dialogowe często potrzebują przechwycić zdarzenie naciśnięcia klawisza Enter w innym widget i specjalnie je obsłużyć.
Filtrowanie zdarzeń class Key. Press. Eater : public QObject { protected: bool event. Filter( QObject *o, QEvent *e ); }; bool Key. Press. Eater: : event. Filter( QObject *o, QEvent *e ) { if ( e->type() == QEvent: : Key. Press ) { // special processing for key press QKey. Event *k = (QKey. Event *)e; q. Debug( "Ate key press %d", k->key() ); return TRUE; // eat event } else { // standard event processing return FALSE; } } Key. Press. Eater *key. Press. Eater = new Key. Press. Eater( this ); QPush. Button *push. Button = new QPush. Button( this ); QList. View *list. View = new QList. View( this ); push. Button->install. Event. Filter( key. Press. Eater ); list. View->install. Event. Filter( key. Press. Eater );
Drzewa obiektów Jeśli tworzymy jakiś QObject deklarując, że rodzicem jest jakiś inny QObject nasz obiekt jest dodawany do listy children() rodzica. l Jeśli obiekt-rodzic zostaje zniszczony, obiekty z listy children() zostają także usunięte. l Dostęp do wszystkich obiektów-korzeni drzew zależności mamy przez funkcję QObject: : object. Trees() l QObject: : dump. Object. Tree() i QObject: : dump. Object. Info() służą do debugowania, gdy aplikacja zachowuje się dziwnie. l
Strzeżone wskaźniki Klasa QGuarded. Ptr jest szablonem do strzeżonych wskaźników do QObject. Strzeżony wskaźnik, QGuarded. Ptr<X>, zachowuje się jak normalny wskaźnik C++ X*, z tym, że gdy obiekt do którego się odnosi zostanie zniszczony, jest automatycznie ustawiany na 0 (w przeciwieństwie do zwyczajnych wskaźników C++, które w takim przypadku stają się „dyndającymi wskaźnikami”). X musi być podklasą QObject. QGuarded. Ptr<QLabel> label = new QLabel( 0, "label" ); label->set. Text( "I like guarded pointers" ); delete (QLabel*) label; // niszczymy wskaźnik if ( label) label->show(); else q. Debug("The label has been destroyed");
Co może biblioteka Qt ? Doskonały zestaw klas pozwalający na budowanie aplikacji opartych na graficznym interfejsie użytkownika l Podsystem sieciowy. Niezależny od platformy bardzo wygodny interfejs gniazd oparty na sygnałach/slotach. l Podsystem SQL, możliwość dołączania własnych sterowników. Funkcjonalność podobna do JDBC. Obsługiwane: My. SQL, Oracle, ODBC, Postgre. SQL, Sybase, IBM DB 2 l Wsparcie dla XML, parser SAX 2 (Simple API for XML), DOM Level 2. l
Kylix l Kylix to środowisko RAD (Rapid Application Development) pod Linuxa. Odpowiednik Delphi i C++ Buildera z pod Windows. Autor: firma Borland. l Aplikacje tworzone w Kylix używają biblioteki Qt do realizacji interfejsu użytkownika.
Qtopia l Oparta na bibliotece Qt. l Platforma dla urządzeń mobilnych z Linuxem, np. dla telefonów komórkowych. l Np. Motorola wybrała Qtopię jako środowisko dla jej A 760 Linux Smartphone (aparat, cyfrowy, mp 3, video, internet) l Wymagania: aby działał linux/embedded z jądrem 2. 4, IPC, framebuffer.
Wnioski l Bardzo obszerne, dobrze zaprojektowane środowisko do tworzenia aplikacji z graficznym interfejsem użytkownika. l Funkcjonalne i praktyczne. Szeroko używane na świecie w projektach komercyjnych i niekomercyjnych.
Dodatkowe źródła l Qt Reference Documentation l Strona firmy Trolltech – http: //www. trolltech. no
Dziękuję l Prezentacja dostępna pod adresem: http: //rainbow. mimuw. edu. pl/~jh 189390/qtprez/index. html
- Slides: 24