SDJ.Software.Developer-'s.Journal.2011.05.PL.(P2PNet.pl).pdf

(6384 KB) Pobierz
530017774 UNPDF
530017774.013.png
Spis treści
5/2011 (197)
BIBLIOTEKA MIESIĄCA
Rafał Kulaga
Niezależnie od przeznaczenia opracowywanej aplikacji, okno główne stanowić będzie zawsze jej wizytówkę. Jest
to bowiem element, którego prawidłowe zaprojektowanie i napisanie ma kluczowe znaczenie dla wygody użyt-
kownika oraz w dużej mierze wpływa na projekt całej aplikacji. W artykule tym Czytelnik będzie miał okazję
zapoznać się z klasami zawartymi w bibliotece Qt, umożliwiającymi tworzenie funkcjonalnych i nowoczesnych
głównych okien aplikacji. Zapraszam do lektury!
WEB DEVELOPMENT
10. Grafika 3D dla WWW
Adam Wiernasz
U progu ery WEB 3.0 przed światem IT otwierają się nowe możliwości prezentacji informacji. Już niedługo spe-
cyfikacja HTML 5 i webGL jako jej składowa, pozwolą na płynną prezentację gier i wizualizacji 3D w środowisku
przeglądarki. Zanim jednak nowe standardy staną się powszechne w codziennym użytku, możemy postarać się
o stworzenie namiastki tego przy użyciu najpopularniejszej na dzień dzisiejszy technologii Flash.
PROGRAMOWANIE PHP
18. Test-Driven Development oraz Continous Integration w projektach PHP 5.3
Wojciech Sznapka
Era, gdy PHP służyło do pisania prostych stron WWW i ksiąg gości dawno minęła. Coraz więcej poważnych firm
stosuje PHP w znaczących projektach, a społeczność i firmy rozwijają technologie, dzięki którym PHP zaczyna do-
ganiać swoich dojrzałych rywali, Javę i .NET. W artykule przedstawię kilka porad i dobrych praktyk, jak sprawić
by projekty testowały się same, co zapewni im dobrą jakość.
PROGRAMOWANIE GRAFIKI
24. Algorytm Lianga-Barsky’ego
Arkadiusz Rataj
Mówiąc o grafice komputerowej, największą dozę emocji dostarczają nam obrazy trójwymiarowe, generowa-
ne przez najnowocześniejsze urządzenia graficzne. Tworzone przez nie projekcje niejednokrotnie wprowadzają
nas w błąd i skłaniają do zastanowienia się, czy oglądany obraz jest rzeczywistym czy wygenerowanym sztucznie?
Nie zdajemy sobie sprawy, że te wszystkie wspaniałości nie istniały by, gdyby nie osiągnięcia w dziedzinie grafiki
dwuwymiarowej. Bowiem za każdym razem, gdy na ekranie ma się pojawić obraz, trzeba rozwiązać jeden pod-
stawowy problem - jak na ekran komputera przenieść obraz znany ze świata rzeczywistego? W artykule przed-
stawiam jedno z możliwych rozwiązań, które wykorzystuje algorytm Lianga-Barsky’ego.
Miesięcznik Software Developer’s Journal
(12 numerów w roku) jest wydawany przez
Software Press Sp. z o.o. SK
Kierownik produkcji: Andrzej Kuca
andrzej.kuca@software.com.pl
Redakcja dokłada wszelkich starań, by publikowane
w piśmie i na towarzyszących mu nośnikach
informacje i programy były poprawne, jednakże nie
bierze odpowiedzialności za efekty wykorzystania
ich; nie gwarantuje także poprawnego działania
programów shareware, freeware i public domain.
Wszystkie znaki firmowe zawarte w piśmie są
własności odpowiednich firm.
Zostały użyte wyłącznie w celach informacyjnych.
Prezes: Paweł Marciniak
Adres korespondencyjny:
Software Press Sp. z o.o. SK,
ul. Bokserska 1, 02-682 Warszawa, Polska
tel. +48 22 427 36 91, fax +48 22 224 24 59
Dyrektor wydawniczy: Natalia Sieniutowicz
Redaktor naczelny: Łukasz Łopuszański
lukasz.lopuszanski@software.com.pl
www.sdjournal.org
cooperation@software.com.pl
Osoby zainteresowane współpracą prosimy o kontakt:
cooperation@software.com.pl
Skład i łamanie: Tomasz Kostro
www.studiopoligraficzne.com
Dział reklamy: adv@software.com.pl
530017774.014.png
Spis treści
INŻYNIERIA OPROGRAMOWANIA
30. Po co nam interfejsy? Tworzenie elastycznego kodu
Michał Bartyzel, Mariusz Sieraczkiewicz
Niektóre wytyczne dotyczące programowania obiektowego traktowane są jako dogmat. Częsty kłopotem do-
gmatu jest stosowanie go w bezrefleksyjny i automatyczny sposób, co prowadzi do całkowitego zagubienia idei,
które ktoś próbował nam przekazać. W artykule zajmiemy się jednym z takich dogmatów, który brzmi: Trzeba
programować poprzez interfejsy. Trzeba? Ale po co?
TESTOWANIE
40. Problematyka testowania akceptacyjnego aplikacji internetowych oraz
automatyzacji testów w projektach komercyjnych - Robot Framework
Marek Zapłata
Testowanie pełni kluczową rolę w procesie wytwarzania oprogramowania, niezależnie od stosowanej w pro-
jekcie metodyki. Jest to zagadnienie niezwykle szerokie, dlatego w literaturze przedmiotu znaleźć można wiele
definicji testowania oraz procesów i narzędzi wspomagających testowanie.
WYWIAD
46. Metoda doskonalenia pracy zespołu. Wywiad z Bartoszem Chrabskim
Reklama
530017774.015.png
BIBLIOTEKA MIESIĄCA
Biblioteka Qt: Budowa głównego
okna aplikacji w oparciu o klasę
QMainWindow
Niezależnie od przeznaczenia opracowywanej aplikacji, okno główne stanowić
będzie zawsze jej wizytówkę. Jest to bowiem element, którego prawidłowe
zaprojektowanie i napisanie ma kluczowe znaczenie dla wygody użytkownika
oraz w dużej mierze wpływa na projekt całej aplikacji. W artykule tym
Czytelnik będzie miał okazję zapoznać się z klasami zawartymi w bibliotece Qt,
umożliwiającymi tworzenie funkcjonalnych i nowoczesnych okien głównych
z wykorzystaniem klasy QMainWindow. Zapraszam do lektury!
Dowiesz się:
• Jak tworzyć profesjonalne główne okna aplikacji bazu-
jące na klasie QmainWindow,
• Jak biblioteka Qt upraszcza tworzenie złożonych inter-
fejsów poprzez wykorzystanie akcji (klasa QAction),
• Jak korzystać z klas QToolBox, QToolBar, QMenu,
QMenuBar, QStatusBar oraz QDockWidget.
Powinieneś wiedzieć:
• Jak tworzyć widgety oraz okna dialogowe w bibliotece
Qt.
nego interfejsu użytkownika, w przypadku aplikacji two-
rzonych z wykorzystaniem biblioteki Qt, jest zapozna-
nie się z klasami, które wykorzystywane są do budowy
głównego okna aplikacji.
Artykuł ten rozpocznie się opisem struktury główne-
go okna aplikacji, z omówieniem i przykładami zastoso-
wania najważniejszych jego elementów takich jak: pa-
sek menu, paski narzędzi, pasek statusu, okna dokowa-
ne oraz widget centralny. Biblioteka Qt zawiera ponadto
klasę QAction , która bardzo upraszcza tworzenie menu
i pasków narzędzi – jej zastosowanie również zostanie
dokładnie opisane. Artykuł zakończony zostanie przypo-
mnieniem podstawowych zasad związanych z mechani-
zmem zarządzania pamięcią w zbiorach obiektów dzie-
dziczących po klasie QObject , tym razem z przykładami
dla opisywanych klas.
sy niezbędne do tworzenia złożonych okien
dialogowych: QDialog oraz klasy layoutów,
wykorzystywane do grupowania widgetów. Czytelnik
miał ponadto okazję zapoznać się z trzema sposobami
wykorzystania plików opisu interfejsu, tworzonych przy
użyciu programu Qt Designer oraz opisem korzyści,
a także potencjalnych problemów wynikających z zasto-
sowania tego narzędzia w większych projektach.
Większość dostępnych na rynku aplikacji łączy bardzo
wiele podobieństw w budowie interfejsów użytkownika.
W głównym oknie aplikacji prezentowany jest zazwy-
czaj aktualnie otwarty dokument, zaś w oknach dialogo-
wych możemy zmieniać konfigurację bardziej szczegóło-
wych aspektów pracy aplikacji lub wpływać na zawartość
otwartego dokumentu. Rozwiązanie takie powoduje, iż
podstawowa funkcjonalność większości aplikacji może
być przez przeciętnego użytkownika wykorzystywana
bez potrzeby odwoływania się do dokumentacji.
Projektowanie graficznych interfejsów użytkownika
jest dziedziną, w której oryginalność rzadko stanowić
będzie powód do dumny – właśnie ze względu na nawy-
ki użytkowników aplikacji. Jednym z podstawowych kro-
ków do utworzenia wygodnego oraz w pełni funkcjonal-
Struktura głównego okna aplikacji
Projektując oraz implementując główne okno aplikacji,
warto trzymać się sprawdzonych wzorców, określają-
cych rozmieszczenie poszczególnych elementów. Za-
wsze warto również korzystać z widgetów dostosowa-
nych do konkretnego zadania – przykładowo, możliwe
jest tworzenie od podstaw pasków narzędzi zawierają-
cych obiekty klasy QPushButton , jednak znacznie lepszym
rozwiązaniem jest zastosowanie obiektów klasy QAction ,
dodawanych do obiektu klasy QToolBar przy użyciu me-
tody addAction() .
4
5/2011
W poprzedniej części cyklu opisane zostały kla-
530017774.016.png
 
530017774.001.png 530017774.002.png 530017774.003.png 530017774.004.png 530017774.005.png 530017774.006.png
 
Budowa głównego okna aplikacji w oparciu o klasę QMainWindow
Z podobną sytuacją mamy do czynienia w przypad-
ku wyboru widgetu, na którym oparte będą okna dialo-
gowe. Oczywiście możliwe jest użycie klasy QWidget ja-
ko klasy bazowej i własnoręczna implementacja wszyst-
kich niezbędnych metod, jednak byłoby to rozwiązanie
zdecydowanie nieefektywne. Klasa bardziej rozbudowa-
na, jaką jest QMainWindow , również nie najlepiej spraw-
dziłaby się w tym zastosowaniu. Jak jednak wiadomo
z poprzedniej części cyklu, biblioteka Qt zawiera klasę
QDialog , która nadaje się w tym celu doskonale, ponie-
waż posiada wszystkie niezbędne metody oraz mechani-
zmy, które w razie potrzeby mogą być przez programi-
stę rozszerzane lub modyfikowane poprzez wykorzysta-
nie dziedziczenia.
Wniosek płynący z powyższych rozważań jest oczywi-
sty – aby uzyskać elastyczny i funkcjonalny interfejs użyt-
kownika, którego modyfikacja w kolejnych wersjach nie
będzie dla programisty drogą przez mękę, należy odpo-
wiednio wybierać klasy do realizacji postawionych za-
dań. Na Rysunku 1 przedstawiony został schemat typo-
wego okna głównego aplikacji wraz z wyróżnionymi naj-
ważniejszymi jego elementami, obok których podane zo-
stały nazwy klas biblioteki Qt, które wykorzystać należy
w celu ich praktycznej realizacji.
Zanim jednak przejdziemy do opisu poszczegól-
nych elementów, warto zapoznać się z samą klasą
QMainWindow , w oparciu o którą buduje się główne okna
aplikacji.
ciu metody setCentralWidget() . Przykład jej zasto-
sowania w konstruktorze obiektu dziedziczącego po
QMainWindow może być następujący:
QGraphicsScene *scene = new QGraphicsScene();
scene->addText("Hello, QMainWindow!", QFont("Times",
18, QFont::Bold));
QGraphicsView *view = new QGraphicsView(scene);
this->setCentralWidget(view);
Klasa QGraphicsScene reprezentuje obszar, na którym
umieszczane mogą być elementy graiczne, takie jak
tekst, obrazy oraz widgety. Obiekty tej klasy mogą być
wyświetlane w instancjach klasy QGraphicsView . Więcej
informacji na temat tych i innych klas służących do wy-
świetlania graiki dwuwymiarowej zawartych zostanie
w jednej z następnych części cyklu.
Akcje i ich zastosowanie
Klasa QAction zapewnia jednolity interfejs umożliwiają-
cy tworzenie akcji interfejsu użytkownika, które mogą
być następnie umieszczane w wielu z elementów głów-
nego okna aplikacji. Każda akcja zawierać może iko-
nę, tekst, opis pomocy kontekstowej, skrót klawiszo-
wy oraz tekst wyświetlany na pasku stanu aplikacji po
jej wybraniu. Właściwości te są ustawiane przez meto-
dy setIcon() , setText() , setWhatsThis() , setShortcut()
oraz setStatusTip() . Dokładny opis tych metod Czytel-
nik znajdzie w dokumentacji biblioteki Qt.
Akcje tworzone są zazwyczaj jako elementy potomne
okna, w którym będą używane. Przed użyciem, muszą
one zostać dodane do odpowiednich widgetów przy po-
mocy metody addAction() klasy QWidget . W celu połą-
czenia akcji z obsługującymi je slotami należy skorzystać
z generowanego przez nie sygnału triggered() , np.:
Klasa QMainWindow
W oparciu o klasę QMainWindow buduje się główne
okna aplikacji. Dziedziczy ona bezpośrednio po klasie
QWidget i nie jest dziedziczona przez żadną klasę nale-
żącą do biblioteki Qt. Główną cechą odróżniającą kla-
QMainWindow od klasy QDialog , jest obsługa mechani-
zmów charakterystycznych dla głównego okna aplikacji
– widgetów dokowanych, pasków narzędzi, menu oraz
statusu.
Struktura głównego okna opartego na klasie
QMainWindow przedstawiona została na Rysunku 1. Dzie-
dziczenie po niej odbywa się w sposób identyczny, jak
w przypadku klasy QDialog , toteż jego opis zostanie
w tym artykule pominięty i zajmiemy się od razu najważ-
niejszymi klasami, wykorzystywanymi w opartych na niej
oknach. Są to:
QObject::connect(deleteAct, SIGNAL(triggered()),
this, SLOT(deleteActHandler));
W powyższym przykładzie zakładamy, że deleteAct
jest wskaźnikiem na obiekt klasy QAction , zaś
deleteActHandler() jest slotem zdeiniowanym np.
w obiekcie klasy QMainWindow .
Tworzenie graficznych interfejsów użytkownika z wy-
korzystaniem pozwala nie tylko na szybkie ustawianie
właściwości takich jak ikona i tekst opisu dla wielu wid-
getów jednocześnie, lecz również ułatwia tworzenie do-
kumentacji kodu. W przypadku zastosowania dużej ilo-
ści sygnałów i slotów niepowiązanych z akcjami, zarzą-
dzanie ich połączeniami staje się wraz z rozwojem apli-
kacji coraz trudniejsze.
QMenuBar – klasa reprezentująca pasek menu;
QToolBar – klasa reprezentująca pasek narzędzi;
QStatusBar – klasa reprezentująca pasek stanu;
QDockWidget – klasa reprezentująca widget dokowany;
QToolBox – klasa reprezentująca zbiór grup narzędzi.
Ponadto instancja klasy QMainWindow posiada tzw.
widget centralny ( central widget ), który wyświetlany
jest w głównym obszarze okna, ustawiany przy uży-
Pasek menu – klasa QMenuBar
Pasek menu jest standardowym elementem każdej aplika-
www.sdjournal.org
5
 
 
530017774.007.png 530017774.008.png 530017774.009.png 530017774.010.png 530017774.011.png
 
530017774.012.png
Zgłoś jeśli naruszono regulamin