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

Podobne dokumenty