Autor: Jarosław Hryciuk j.hryciuk@students.mimuw.edu.pl Biblioteka QT Autor: Jarosław Hryciuk j.hryciuk@students.mimuw.edu.pl
Plan prezentacji: Twórcy Zastosowania Licencja Rozszerzenia C++: Qt Object Model Co może biblioteka Qt
Twórcy biblioteki: Trolltech Firma norweska Główny produkt: Qt Qtopia
Zastosowania Mnóstwo udanych, komercyjnych produktów opartych na Qt Środowisko KDE pod X Windows System Mnóstwo różnorakiego oprogramowania użytkowego na licencji GPL pod X11.
Licencja Wersja GPL tylko na platformy Unix/X11, Macintosh, Linux/embedded. Wersja komercyjna także na platformę Windows 32 bit.
Przenaszalność Wersje dla różnych systemów operacyjnych Niezależny od kompilatora; rozszerzenia języka są oparte na Meta Object System, a nie na rozszerzeniach konkretnego kompilatora
Qt Object System Sygnały i sloty Własności obiektów QString – internacjonalizacja napisów. Zdarzenia i filtry zdarzeń Drzewa obiektów, porzucanie obiektów Strzeżone wskaźniki
Sygnały i sloty Funkcja: komunikacja między obiektami QOBJECT Wygodne przy tworzeniu interfejsów graficznych Sygnał podłączany do slotu Relacja wiele-do-wielu.
Sygnały i sloty Makrodefinicja potrzebna do MOC Foo a, b; class Foo : public QObject { Q_OBJECT public: Foo(); int value() const { return val; } public slots: void setValue( int ); signals: void valueChanged( int ); private: int val; }; Makrodefinicja potrzebna do MOC void Foo::setValue( int v ) { if ( v != val ) { val = v; emit valueChanged(v); } Foo a, b; connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); b.setValue( 11 ); // a == undefined b == 11 a.setValue( 79 ); // a == 79 b == 79 b.value(); // returns 79
Sygnały i sloty: dlaczego? 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: Wygodniejsze w użyciu. Bezpieczne pod względem typów (type safe) – tylko sygnał zgodny z typem slotu może zostać do niego podłączony. Projektując slot/sygnał nie musimy wiedzieć jak zostanie podłączony. Pełna abstrakcja i modularyzacja. Wady: Około 10x wolniejsze niż „tradycyjne” callback.
QString Klasa do reprezentacji napisów. Wewnętrzny sposób kodowania: unicode. Używamy tr() do tekstów widocznych dla użytkownika: LoginWidget::LoginWidget() { QLabel *label = new QLabel( tr("Password:"), this ); ... } Używanie tr() w całej aplikacji gwarantuje właściwe kodowanie napisów.
QString Parametryzowane napisy: QString s1 = "%1 of %2 files copied. Copying: %3"; QString s2 = "Kopierer nu %3. Av totalt %2 filer er %1 kopiert."; qDebug( s1.arg(5).arg(10).arg("somefile.txt").ascii() ); qDebug( s2.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ń Zdarzenie to klasa, która dziedziczy po QEvent. QResizeEvent, QPaintEvent, QKeyEvent, QTimerEvent, QMouseEvent etc. Mechanizm filtrowania zdarzeń.
Filtrowanie zdarzeń Pozwala na przechwytywanie i filtrowanie zdarzeń adresowanych do innych obiektów. 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 KeyPressEater : public QObject { protected: bool eventFilter( QObject *o, QEvent *e ); }; bool KeyPressEater::eventFilter( QObject *o, QEvent *e ) { if ( e->type() == QEvent::KeyPress ) { // special processing for key press QKeyEvent *k = (QKeyEvent *)e; qDebug( "Ate key press %d", k->key() ); return TRUE; // eat event } else { // standard event processing return FALSE; } KeyPressEater *keyPressEater = new KeyPressEater( this ); QPushButton *pushButton = new QPushButton( this ); QListView *listView = new QListView( this ); pushButton->installEventFilter( keyPressEater ); listView->installEventFilter( keyPressEater );
Drzewa obiektów Jeśli tworzymy jakiś QObject deklarując, że rodzicem jest jakiś inny QObject nasz obiekt jest dodawany do listy children() rodzica. Jeśli obiekt-rodzic zostaje zniszczony, obiekty z listy children() zostają także usunięte. Dostęp do wszystkich obiektów-korzeni drzew zależności mamy przez funkcję QObject::objectTrees() QObject::dumpObjectTree() i QObject::dumpObjectInfo() służą do debugowania, gdy aplikacja zachowuje się dziwnie.
Strzeżone wskaźniki Klasa QGuardedPtr jest szablonem do strzeżonych wskaźników do QObject. Strzeżony wskaźnik, QGuardedPtr<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. dddd QGuardedPtr<QLabel> label = new QLabel( 0, "label" ); label->setText( "I like guarded pointers" ); delete (QLabel*) label; // niszczymy wskaźnik if ( label) label->show(); else qDebug("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 Podsystem sieciowy. Niezależny od platformy bardzo wygodny interfejs gniazd oparty na sygnałach/slotach. Podsystem SQL, możliwość dołączania własnych sterowników. Funkcjonalność podobna do JDBC. Obsługiwane: MySQL, Oracle, ODBC, PostgreSQL, Sybase, IBM DB2 Wsparcie dla XML, parser SAX 2 (Simple API for XML), DOM Level 2.
Kylix Kylix to środowisko RAD (Rapid Application Development) pod Linuxa. Odpowiednik Delphi i C++ Buildera z pod Windows. Autor: firma Borland. Aplikacje tworzone w Kylix używają biblioteki Qt do realizacji interfejsu użytkownika.
Qtopia Oparta na bibliotece Qt. Platforma dla urządzeń mobilnych z Linuxem, np. dla telefonów komórkowych. Np. Motorola wybrała Qtopię jako środowisko dla jej A760 Linux Smartphone (aparat, cyfrowy, mp3, video, internet) Wymagania: aby działał linux/embedded z jądrem 2.4, IPC, framebuffer.
Wnioski Bardzo obszerne, dobrze zaprojektowane środowisko do tworzenia aplikacji z graficznym interfejsem użytkownika. Funkcjonalne i praktyczne. Szeroko używane na świecie w projektach komercyjnych i niekomercyjnych.
Dodatkowe źródła Qt Reference Documentation Strona firmy Trolltech – http://www.trolltech.no
Dziękuję Prezentacja dostępna pod adresem: http://rainbow.mimuw.edu.pl/~jh189390/qtprez/index.html