240 likes | 399 Views
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.
E N D
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 class Foo : publicQObject { Q_OBJECT public: Foo(); int value() const { return val; } public slots: void setValue( int ); signals: void valueChanged( int ); private: int val; }; 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. 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