Oprogramowanie i wykorzystanie stacji roboczych Wykład 1
Transkrypt
Oprogramowanie i wykorzystanie stacji roboczych Wykład 1
Oprogramowanie i wykorzystanie stacji roboczych Wykład 1 Dr inż. Tomasz Olas [email protected] Instytut Informatyki Teoretycznej i Stosowanej Politechnika Cz˛estochowska Wykład 1 – p. 1/3 X Window System (I) X Window System można określić jako okienkowy rozproszony interfejs graficzny Powstał w 1985 roku w Massachusetts Institute of Technology Public Domain Działa na wiekszości ˛ systemów zgodnych z C i POSIX obecna wersja: X11R7.4 (wersja 11 wydanie 7.4) jest zbiorem protokołów sieciowych takich jak telnet, ftp, http, które pozwalaja˛ na zbudowanie rozproszonego systemu okienkowego. Istnieja˛ darmowe implementacje systemu X - XFree86, X.Org. Poczawszy ˛ od wersji XFree86 2.4 istnieje wsparcie dla akceleracji sprz˛etowej (DRI - Direct Rendering Infrastructure) Wykład 1 – p. 2/3 X Window System (II) X Window opiera sie na modelu klient-serwer. W X z użytkownikiem współdziała serwer, podczas gdy w innych typach usług po stronie użytkownika znajduje sie˛ klient. Aplikacje bed ˛ ace ˛ klientami moga˛ działać na komputerze lokalnym badź ˛ odległym. Programy uruchomione na odległych komputerach moga˛ działać na różnych systemach operacyjnych, korzystajac ˛ z lokalnego interfejsu graficznego. Działa niezależnie od zastosowanego protokołu komunikacyjnego (TCP/IP, DECnet, gniazdka w domenie UNIX, wspólna pamieć). ˛ X11 zapewniaja˛ tylko podstawowe mechanizmy służace ˛ do tworzenia aplikacji. Nie definiuja˛ interfejsu użytkownika - istnieje pewien szczególny klient o nazwie Window Manager zarzadzaj ˛ acy ˛ całościa˛ interfejsu. Wykład 1 – p. 3/3 X Window System (III) W systemie X zapewnione jest, że zachowanie sie (feel) aplikacji bedzie ˛ takie samo niezależnie od systemu (Window Managera). Natomiast prezentacja (look) zależy od Window Managera. X sa˛ wielookienkowe - na ekranie może być otwartych wiele okien i w każdym z nich bedzie ˛ uruchomione odrebne ˛ zadanie. Okna sa˛ ułożone w sposób hierarchiczny - każde okno ma swoje okno macierzyste. Istnieje jedno okno bed ˛ ace ˛ oknem macierzystym dla wszystkich pozostałych okien (root window). W danej chwili aktywne jest tylko jedno okno do którego można wprowadzać informacje za pomoca˛ klawiatury lub myszy. Wykład 1 – p. 4/3 X - Komunikacja klient - serwer Klient oczekuje zdarzeń określonych typów zachodzacych ˛ we wszystkich oknach, od których jawnie zarzadał ˛ odbierania zdarzeń. Po potwierdzeniu, że zaszło w danym oknie pewne zdarzenie serwer wysyła je do wszystkich klientów oczekujacych ˛ na zdarzenia zachodzace ˛ w tym oknie. Wykład 1 – p. 5/3 X - Zasoby Zarzadzaniem ˛ zasobami (oknami, kontekstami graficznymi, czcionkami, tablicami kolorów, itp..) zajmuje sie˛ serwer X. Zasoby sa˛ identyfikowane przez 32-bitowe numery i współdzielone przez aplikacje klientów. Okna potomne dziedzicza˛ zasoby od swojego okna macierzystego, chyba że określono inaczej. Definicje czcionek sa˛ przechowywane w plikach umieszczonych na komputerze serwera i w miare˛ potrzeby ładowane przez klientów. Od wersji X11R5 została wprowadzona usługa „X Font Service”. X zostały zaprojektowane z myśla˛ o rozszerzaniu ich o nowe żadania, ˛ zasoby i zdarzenia. Można go wiec ˛ rozbudowywać. Dwóch klientów może przesyłać pomiedzy ˛ soba˛ za pośrednictwem serwera tzw. pseudozadania (do 20kB). Wykład 1 – p. 6/3 X Window System - klienci X-klient jest to aplikacja, która została utworzona przy wykorzystaniu biblioteki Xlib. Uruchamiajac ˛ X-klienta (aplikacje) ˛ można podać określić dodatkowe opcje dotyczace: ˛ adresu serwera: -display adres-ip:0.0 geometrii: -geometry szerxwys+xoff+yoff kolorów: -fg yellow -bg blue -bd red innych parametry: -title xxx -fn xxx ... Przykładowi klienci X: xclock, xmag, xterm, ... Wykład 1 – p. 7/3 X Window System - Serwer X Serwer X jest niezależnym od jadra ˛ procesem UNIX’a uruchamianym w tle. Aplikacje klientów korzystaja˛ z biblioteki Xlib. Uruchamianie zdalnej aplikacji: na komputerze zarzadzaj ˛ acym ˛ panelem graficznym na którym ma być wyświetlana aplikacja należy: uruchomić serwer X, np. startx umożliwić zdalnej maszynie dostep ˛ do panela graficznego, np. xhost +alfa.imi.pcz.czest.pl należy zalogować sie˛ na komputer odległy, a nastepnie: ˛ albo nadać zmiennej DISPLAY wartość identyfikujac ˛ a˛ panel graficzny, np. export DISPLAY=lab83a:0.0 albo uruchomić aplikacje˛ z opcja˛ -display, np. xlogo -display lab83a:0.0 Wykład 1 – p. 8/3 Biblioteka Qt (I) Qt jest kompleksowym „środowiskiem programistycznym” dla jezyka ˛ C++ (Java), zawierajacym ˛ bibliotek˛e klas i narz˛edzia do tworzenia aplikacji wieloplatformowych. Umożliwia tworzenie aplikacji wieloplatformowych zgodnie z zasada˛ „write once, compile anywhere”. Wykład 1 – p. 9/3 Biblioteka Qt (II) Wieloplatformowa: Microsoft Windows (Vista, Server 2003, XP, NT 4, Me/98), MacOS X, Linux, Solaris, HP-UX, Tru64 (Digital UNIX), Irix, FreeBSD, BSD/OS, SCO AIX. Biblioteka jest udostepniana ˛ na podwójnej licencji: dla zastosowań komercyjnych istnieje licencja płatna, natomiast dla projektów niekomercyjnych dostepna ˛ jest wersja darmowa. Narz˛edzia służace ˛ do generowania aplikacji graficznych (RAD Rapid Application Development) np. Qt Designer, Kdevelopment, Eclipse - Eclipse X11 integration GPLed i inne). Istnieje wersja biblioteki Qt dla systemów wbudowanych i urzadze ˛ ń mobilnych (Embeded Linux i Microsoft Windows CE), Zawiera wsparcie dla biblioteki OpenGL. Wykład 1 – p. 10/3 Architektura Biblioteka Qt udostepnia ˛ dobrze zaprojektowany i intuicyjny zestaw klas służacych ˛ do tworzenia rozbudowanych aplikacji wykorzystujacych ˛ graficzny interfejs użytkownika (GUI). Wykład 1 – p. 11/3 Wykorzystanie Zbudowano bardzo wiele udanych produktów komercyjnych wykorzystujacych ˛ bibliotek˛e Qt (wykorzystywane miedzy ˛ innymi przez firmy Adobe, IBM, Motorola, NASA, Mathematica, Lucas Film Ltd., Google Earth, Volvo i wiele innych). Środowisko KDE pod system X Window opiera sie˛ o bibliotek˛e Qt. VLC media player: Wykład 1 – p. 12/3 Budowa Biblioteka Qt jest zbudowana na niskopoziomowych interfejsach API udostepnianych ˛ przez dana˛ architekture. ˛ Qt Application Source Code Qt API Qt/Windows Qt/X11 Qt/Macintosh GDI Xlib Carbon MS-Windows Unix/Linux Mac OS X Qt/Embedded Embedded Linux Zastosowanie takiego podejścia powoduje, że biblioteka Qt jest przenośna, a jednocześnie wydajna. Wykład 1 – p. 13/3 Biblioteka Qt - przykład aplikacji #include <QApplication> #include <QPushButton> int main(int argc, char **argv) { QApplication a(argc, argv); QPushButton hello("Hello world!"); hello.resize(160, 30); hello.show(); return a.exec(); } kompilacja: g++ -I/usr/include/qt4/QtGui -L/usr/lib64/qt4 -lQtGui -I/usr/include/qt4 t1.cpp Wykład 1 – p. 14/3 Właściwości Biblioteka Qt udostepnia ˛ bogaty zbiór widgetów (w systemie MS Windows takie obiekty nazywane sa˛ kontrolkami (controls) lub okienkami (windows), które udostepniaj ˛ a˛ funkcjonalność GUI. Posiada standardowy model obsługi zdarzeń umożliwiajacy ˛ na reagowanie np. na ruch myszy, czy też przyciśniecie ˛ przez użytkownika klawisza. Oprócz tego udostepnia ˛ mechanizm sygnałów i slotów (signals and slots), który umożliwia przesyłanie komunikatów pomiedzy ˛ obiektami. Jest niezależna od kompilatora. Wprawdzie wprowadza rozszerzenia do jezyka, ˛ ale opieraja˛ sie˛ one na Meta Object System (MOC), a nie na rozszerzeniach konkretnego kompilatora. Wykład 1 – p. 15/3 Widgety Widgety sa˛ to elementy graficznego interfejsu użytkownika. Sa˛ nimi Wszystkie widoczne elementy aplikacji (przyciski, paski menu, paski przewijania, linie edycyjne). Widget może zawierać pewna˛ liczbe˛ potomnych widgetów (child widgets). Widgety potomne sa˛ wyświetlane wewnatrz ˛ obszaru widgetu rodzica (parent widget). Widget, który nie posiada rodzica jest tzw. głównym widgetem aplikacji (oknem). Posiada on zazwyczaj pasek zadań (belk˛e tytułowa), ˛ której wyglad ˛ i opcje zależa˛ od systemu operacyjnego (w przypadku X Window od Window Manager’a). Wykład 1 – p. 16/3 Hierarchia widgetów Klasa˛ bazowa˛ dla widgetów jest klasa QWidget. Widgetami sa˛ wszystkie obiekty klas dziedziczacych ˛ bezpośrednio lub pośrednio po klasie QWidget (jak również obiekty klasy QWidget). QObject QWidget QTimer QDialog QSpinBox QFrame QLabel QLineEdit Wykład 1 – p. 17/3 Drzewa obiektów Gdy tworzymy obiekt klasy QObject określajac, ˛ że rodzicem jest jakiś inny obiekt klasy QObject, to tworzony obiekt jest dodawany do listy children() rodzica. Jeśli obiekt-rodzic zostaje zniszczony, to również automatycznie zostaja˛ zniszczone obiekty z listy children. Zasady te oczywiście dotycza˛ również widgetów. Lista wszystkich drzew obiektów jest dostepna ˛ przez statyczna˛ metode˛ objectTrees klasy QObject. Metody QObject::dumpObjectTree() może być wykorzystana do debugowania aplikacji w przypadku problemów. Wykład 1 – p. 18/3 Mechanizm sygnałów i slotów Mechanizm sygnałów i slotów umożliwia komunikacje˛ pomiedzy ˛ obiektami. Sygnał jest komunikatem informujacym, ˛ o wystapieniu ˛ pewnego zdarzenia. Obiekty z biblioteki Qt emituja˛ (emit) sygnał w momencie wystapienia ˛ zdarzenia, np. gdy użytkownik nacisnał˛ przycisk (QPushButton) - przycisk emituje sygnał clicked. Slot jest specyficzna˛ metoda˛ obiektu z biblioteki Qt, które może obsługiwać zdarzenie, np. zamykajaca ˛ aplikacje Qt (quit z klasy QApplication). Zarówno sygnały, jak i sloty moga˛ posiadać parametry, poprzez które można przekazywać dodatkowe informacje o zaistniałym zdarzeniu. Sygnały można dowolnie łaczyć ˛ ze slotami (o ile posiadaja˛ takie same parametry). Wykład 1 – p. 19/3 Sygnały i sloty - relacje Dany sygnał może zostać połaczony ˛ z wieloma slotami, jak również ze slotem może został połaczonych ˛ wiele sygnałów. Do łaczenia ˛ sygnałów ze slotami służy metoda connect z klasy QObject. Mechanizm sygnałów i slotów może być wykorzystywany w obiektach klas dziedziczacych ˛ po klasie QObject. Object1 connect( Object1, signal1, Object2, slot1 ) connect( Object1, signal1, Object2, slot2 ) signal1 signal2 Object2 signal1 slot1 slot2 Object3 signal1 connect( Object1, signal2, Object4, slot1 ) Object4 slot1 connect( Object3, signal1, Object4, slot3 ) slot1 slot2 slot3 Wykład 1 – p. 20/3 Sygnały i sloty - zalety i wady Zalety: wygodniejsze w użyciu od standardowego modelu obsługi zdarzeń, bezpieczne pod wzgledem ˛ typu (type safe) - tylko sygnał którego parametry sa˛ zgodne z parametrami slotu moga˛ być ze soba˛ połaczone. ˛ projektujac ˛ sloty/sygnały nie musimy wiedzieć jak zostana˛ one wykorzystane w aplikacji (pełna abstrakcja i modularyzacja), istnieje możliwość dynamicznego łaczenia/rozł ˛ aczania ˛ sygnałów i slotów w trakcie działania aplikacji. Wady: wolniejsze od tradycyjnego wywołania funkcji. Wykład 1 – p. 21/3 Podstawowe typy „okien” QWidget QDialog QFrame QGridView QScrollView QWizard Wykład 1 – p. 22/3 Podstawowe elementy GUI Wykład 1 – p. 23/3 Rozbudowane elementy GUI (I) Wykład 1 – p. 24/3 Rozbudowane elementy GUI (II) Wykład 1 – p. 25/3 Rozbudowane elementy GUI (III) Wykład 1 – p. 26/3 Przykład 2 (I) class MyWidget: public QWidget { public: MyWidget(QWidget *parent = 0); }; MyWidget::MyWidget(QWidget *parent): QWidget(parent) { setWindowTitle("Mywidget"); setMinimumSize(220, 120); // setMaximumSize(220, 120); QPushButton *ok = new QPushButton("Ok", this); ok->setGeometry(85, 45, 50, 30); connect(ok, SIGNAL(clicked()), qApp, SLOT(quit())); } Wykład 1 – p. 27/3 Przykład 2 (II) int main(int argc, char** argv) { QApplication app(argc, argv); MyWidget widget; widget.show(); return app.exec(); } Wykład 1 – p. 28/3 Zdarzenia w bibliotece Qt W bibliotece Qt zdarzenia opisywane sa˛ przez obiekty klas dziedziczacych ˛ po klasie QEvent. Zdarzenia sa˛ dostarczane do obiektów Qt (dziedziczacych ˛ pośrednio lub bezpośrednio po klasie QObject). Do obsługi zdarzeń wykorzystywana jest metoda event(QEvent*). Wiekszość ˛ zdarzeń jest zwiazanych ˛ z GUI, ale istnieja˛ również zdarzenia nie zwiazane ˛ z wygladem ˛ aplikacji (np. zwiazane ˛ z gniazdkami). Zdarzenia moga˛ być obsługiwane w metodzie event. Znacznie wygodniej jest w wiekszości ˛ wypadków korzystać ze specjalizowanych metod do obsługi zdarzeń. Wykład 1 – p. 29/3 Metody obsługi zdarzeń klasy QWidget Zdarzenia zwiazane ˛ z klawiatura: ˛ keyPressEvent(QKeyEvent*), keyReleaseEvent(QKeyEvent*) focusInEvent(QFocusEvent*), focusOutEvent(QFocusEvent*) Zdarzenia zwiazane ˛ z myszka: ˛ mousePressEvent(QMouseEvent*), mouseReleaseEvent(QMouseEvent*), mouseDoubleClickEvent(QMouseEvent*), mouseMoveEvent(QMouseEvent*), enterEvent(QEvent*), leaveEvent(QEvent*) Zdarzenia zwiazane ˛ z oknami: paintEvent(QPaintEvent*), moveEvent(QMoveEvent*), resizeEvent(QResizeEvent*), showEvent(QShowEvent*), hideEvent(QHideEvent*) Wykład 1 – p. 30/3 Przykładowe zdarzenia Wybrane metody klasy QMouseEvent: const QPoint & pos () const int x () const int y () const const QPoint & globalPos () const int globalX () const int globalY () const ButtonState button () const LeftButton RightButton MidButton NoButton Wybrane metody klasy QKeyEvent: int key () const (Qt::Key, np. Qt::Key_End, Qt::Key_J) int ascii () const QString text () const Wykład 1 – p. 31/3 Obsługa zdarzeń - przykład class MyPushButton: public QPushButton { public: MyPushButton(const QString & text, QWidget * parent = 0); protected: void keyPressEvent(QKeyEvent * e); }; MyPushButton::MyPushButton(const QString & text, QWidget * parent): QPushButton(text, parent) { } void MyPushButton::keyPressEvent(QKeyEvent * e) { setText(e->text()); } Wykład 1 – p. 32/3 Filtrowanie zdarzeń Mechanizm filtrowania zdarzeń pozwala na przechwytywanie i filtrowanie zdarzeń adresowanych do innych obiektów. Jest użyteczny przy tworzeniu GUI, np. okno dialogowe może filtrować zdarzenia zwiazane ˛ z przyciśnieciem ˛ klawisza w odniesieniu do niektórych jego widgetów (np. zdarzeń zwiazanych ˛ z przyciśnieciem ˛ klawisza Enter czy Tab). Do filtrowania zdarzeń służa˛ metody klasy QObject: void installEventFilter(const QObject* filterObj) void removeEventFilter(const QObject* obj) virtual bool eventFilter(QObject* watched, QEvent* e) Wykład 1 – p. 33/3 Filtrowanie zdarzeń - przykład class KeyPressEater : public QObject { ... protected: bool eventFilter( QObject *o, QEvent *e ); }; bool KeyPressEater::eventFilter( QObject *o, QEvent *e ) { if ( e->type() == QEvent::KeyPress ) { QKeyEvent *k = (QKeyEvent *)e; ... // obsługa naciśni˛ ecia klawisza w klasie KeyPressEater return TRUE; // zdarzenie nie zostanie wysłane do obiektu QObject } else { return FALSE; // standardowa obsługa pozostałych zdarzeń } } ... KeyPressEater *keyPressEater = new KeyPressEater(this); QPushButton *pushButton = new QPushButton(this); pushButton->installEventFilter(keyPressEater); Wykład 1 – p. 34/3