SDJ 02.2011 PL.pdf

(14257 KB) Pobierz
413821664 UNPDF
413821664.028.png
1/2011 (195)
SPIS TREŚCI
BIBLIOTEKA MIESIĄCA
przy użyciu programowalnych jednostek cieniowania
(ang. shaders ) oraz biblioteki XNA.
4 Biblioteka Qt : Podstawy tworzenia
graficznych interfejsów użytkownika
Rafał Kułaga
Graficzny interfejs użytkownika jest obecnie niezbęd-
nym elementem każdej aplikacji. Niezależnie od tego,
czy tworzymy stronę WWW, aplikację webową, aplikację
dla urządzenia mobilnego lub przeznaczoną do wykona-
nia na standardowym komputerze PC, odpowiedni pro-
jekt interfejsu jest warunkiem koniecznym do osiągnię-
cia sukcesu. W artykule tym dowiesz się jak tworzyć pod-
stawowe interfejsy użytkownika w aplikacjach korzystają-
cych z biblioteki Qt, zarówno przy użyciu narzędzia Qt De-
signer, jak i bezpośrednio w kodzie aplikacji.
PROGRAMOWANIE QT
28 Aplikacja w Qt 4.7 – Notatki
Łukasz Klejnberg
Dowiemy się m.in., jak tworzyć listy, zakładki, przyciski,
akcje, okna dialogowe, pasek narzędzi. Poznamy także
podstawowe operacje na plikach tekstowych. Ostatecz-
nie stworzymy zaawansowany notatnik.
PROGRAMOWANIE JAVA
KLUB TECHNICZNY
50 Komponenty kompozytowe w JSF 2.0.
Przedstawienie komponentów kompozytowych
w najnowszej wersji specyfikacji Java Server
Faces 2.0
Mateusz Grzechociński
Java Server Faces 2.0 jest jedną ze specyfikacji, która
w ramach Java Enterprise Edition 6 została istotnie wzbo-
gacona o nowe standardy. Część z nich jest zupełnie no-
wa, inne są jedynie oficjalnym potwierdzeniem i przyję-
ciem znanych już rozwiązań wprowadzonych przez fra-
meworki związane do tej pory ściśle z JSF (jak np. Face-
lets). Jednym z elementów JSF, które zostały w najnow-
szej wersji znacznie uproszczone, jest tworzenie kompo-
zytowych komponentów.
14 Technologie Progress OpenEdge
– Część 15. Historia wersji Progressa
Piotr Tucholski
W ostatnim odcinku zapraszam Państwa w podróż do
początków powstania technologii Progress i OpenEdge.
Cofniemy się aż o 26 lat, co z punktu widzenia rozwoju
technik komputerowych jest całą epoką. Początek sięga
bowiem czasów, gdy pracowało się bez Internetu i twar-
dych dysków... Przyjrzymy się najważniejszym elemen-
tom dodawanym i rozwijanym w poszczególnych wer-
sjach aż do dnia dzisiejszego.
PROGRAMOWANIE GRAFIKI
WARSZTATY
54 Architektura pluginów z wykorzystaniem
bibliotek dynamicznych DLL Pierwsza część
poradnika, pokazującego proces pisania
aplikacji rozszerzalnej poprzez samodzielnie
tworzone pluginy
Tomasz Kowalczyk
Biblioteki dynamiczne to jedna z najbardziej rozpo-
wszechnionych metod rozszerzania funkcjonalności pro-
gramów w języku C++, gdzie każdy fragment kodu musi
zostać skompilowany przed wykonaniem. W niniejszym
artykule przedstawię możliwości, jakie niesie za sobą ta
technologia i dlaczego warto się nią zainteresować. Poka-
żę też, jak napisać taką bibliotekę oraz program, który bę-
dzie umiał ją wykorzystać.
20 Programowalne jednostki cieniowania
w XNA: technika mapowania normalnych.
Nowoczesna sztuka przy użyciu GPU
Petri Wilhelmsen
Grając w najnowsze gry dostępne na nowoczesnych kon-
solach czy komputerach PC nieraz zastanawiałeś się za-
pewne: jak oni zaimplementowali te wszystkie niesamo-
wite efekty graficzne!? Czytając niniejszy artykuł masz
szansę poznać tajniki tworzenia tego rodzaju efektów
2
1/2011
2
413821664.029.png 413821664.030.png 413821664.031.png 413821664.001.png 413821664.002.png
 
SPIS TREŚCI
SPIS TREŚCI
60 NHibernate vs Entity Framework.
Frameworki ORM dla platformy .NET
Agnieszka Polak, Przemysław Krysztowiak
Mapowanie obiektowo-relacyjne jest dziś nieodłącznym
składnikiem projektowania aplikacji bazodanowych w ję-
zykach obiektowych. Chcielibyśmy przybliżyć Czytelni-
kom dwa narzędzia realizujące odwzorowanie obiektów
biznesowych na bazę danych w środowisku .NET, obrazu-
jąc ich wykorzystanie przykładami w języku C#. NHiberna-
te jest dotnetową implementacją rozwijanego od wielu lat
otwartoźródłowego projektu znanego programistom Javy,
zaś ADO.NET Entity Framework to rozwiązanie zaofero-
wane stosunkowo niedawno przez Microsoft.
CLOUD COMPUTING
76 Cloud Computing. Wprowadzenie do baz
danych Microsoft SQL Azure
Tobiasz Janusz Koprowski
Platforma SQL Azure staje się pożądanym elementem
środowiska, które planujemy przenieść do chmury. W za-
sadzie bez względu na to, czy nasze aplikacje i narzędzia
będą pracowały wyłącznie w środowisku rozproszonym:
cloud computing, czy też w środowisku mieszanym: on-
premise + cloud. Przyjrzyjmy się zatem, jakie właściwości
posiada baza Microsoft SQL Azure.
Miesięcznik Software Developer’s Journal
(12 numerów w roku)
jest wydawany przez Software Press Sp. z o.o. SK
TESTOWANIE OPROGRAMOWANIA
Redaktor naczelny:
Łukasz Łopuszański lukasz.lopuszanski@software.com.pl
94 Ryzyko a testowanie oprogramowania
Jan Sabak
W definicji ryzyka należy zwrócić szczególną uwagę na
dwa pojęcia: prawdopodobieństwo i konsekwencje (skut-
ki), czyli materializację tego ryzyka. Należy także pamię-
tać, że ryzyko jest tym większe, im większe jest prawdopo-
dobieństwo jego wystąpienia. I tym większe, im groźniej-
sze są potencjalne skutki.
Skład i łamanie:
Tomasz Kostro www.studiopoligraficzne.com
Kierownik produkcji:
Andrzej Kuca andrzej.kuca@software.com.pl
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
www.sdjournal.org cooperation@software.com.pl
Dział reklamy: adv@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.
RECENZJA
98 Linksys E2000-EE
Wszystkie znaki firmowe zawarte w piśmie są własności odpowiednich
firm.
Zostały użyte wyłącznie w celach informacyjnych.
Osoby zainteresowane współpracą prosimy o kontakt:
cooperation@software.com.pl
www.sdjournal.org
3
413821664.003.png 413821664.004.png 413821664.005.png 413821664.006.png 413821664.007.png 413821664.008.png 413821664.009.png 413821664.010.png 413821664.011.png
BIBLIOTEKA MIESIĄCA
Biblioteka Qt : Podstawy
interfejsów użytkownika
Graficzny interfejs użytkownika jest obecnie niezbędnym elementem
każdej aplikacji. Niezależnie od tego, czy tworzymy stronę
WWW, aplikację webową, aplikację dla urządzenia mobilnego
lub przeznaczoną do wykonania na standardowym komputerze
PC, odpowiedni projekt interfejsu jest warunkiem koniecznym
do osiągnięcia sukcesu. W artykule tym dowiesz się jak tworzyć
podstawowe interfejsy użytkownika w aplikacjach korzystających
z biblioteki Qt, zarówno przy użyciu narzędzia Qt Designer, jak
i bezpośrednio w kodzie aplikacji. Zapraszam do lektury!
Dowiesz się:
• Jak poprawnie tworzyć interfejsy użytkownika przy wykorzy-
staniu layoutów;
• Jak tworzyć proste okna dialogowe;
• Jak korzystać z programu Qt Designer oraz stosować pliki opi-
su interfejsu w projektach.
Powinieneś wiedzieć:
• Podstawy programowania w języku C++;
• Podstawy wykorzystania biblioteki Qt (opisane w pierwszej
części cyklu).
proces instalacji i konfiguracji biblioteki Qt
oraz opis jej podstawowych mechanizmów,
takich jak sygnały i sloty oraz metaobiekty. Ich zastoso-
wanie zilustrowane zostało kilkoma przykładami. Czy-
telnik miał również okazję zapoznać się z klasami kon-
tenerowymi biblioteki Qt oraz podstawami klasami wy-
korzystywanymi w programowaniu model-widok.
W prezentowanych dotychczas przykładach, w ce-
lu budowy graficznych interfejsów użytkownika ko-
rzystano z elementarnych klas, takich jak QWidget ,
QDialog oraz podstawowych układów widgetów, takich
jak QVBoxLayout oraz QHBoxLayout . Jakkolwiek nadają
się one doskonale do zastosowania w prostych przy-
kładach, interfejsy oparte jedynie o nie byłyby bardzo
ubogie: nie mielibyśmy bowiem możliwości tworzenia
menu, pasków narzędzi, pasków statusu oraz okien
dokowanych, które wykorzystywane są we wszystkich
nowych aplikacjach.
Artykuł ten ma za zadanie wprowadzić Czytelnika
do tworzenia zaawansowanych interfejsów użytkowni-
ka. Omówione zostaną wszystkie klasy layoutów, od-
powiadające za rozmieszczenie widgetów oraz klasa
QDialog , na bazie której tworzone są okna dialogowe.
W następnej części cyklu Czytelnik będzie miał okazję
zapoznać się z klasą QMainWindow , która służy do two-
rzenia głównych okien aplikacji. Biblioteka Qt pozwa-
la na tworzenie graficznych interfejsów użytkownika
bezpośrednio w kodzie oraz przy użyciu narzędzia Qt
Designer, które pozwala na tworzenie interfejsów po-
przez rozmieszczenie widgetów na formatkach. W ar-
tykule omówione zostaną obydwie metody. Zacznie-
my jednak od krótkiej charakterystyki tworzenia GUI
w aplikacjach korzystających z biblioteki Qt.
Elementy GUI w bibliotece Qt
Klasy służące do budowy graficznych interfejsów użyt-
kownika zostały w bibliotece Qt umieszczone w modu-
le QtGui , dostępnym domyślnie we wszystkich projek-
tach. Już krótka analiza hierarchii dziedziczenia naj-
ważniejszych klas tego modułu pozwala zauważyć, iż
większość z nich wywodzi się od kilku podstawowych
4
1/2011
tworzenia graficznych
W pierwszej części cyklu przedstawiony został
413821664.012.png 413821664.013.png
 
413821664.014.png 413821664.015.png 413821664.016.png 413821664.017.png 413821664.018.png
Biblioteka Qt : Podstawy tworzenia graficznych interfejsów użytkownika
klas, z którymi warto się zapoznać. Najważniejsze
z nich to QWidget , QLayout , QGraphicsScene oraz klasy
po nich dziedziczące.
powinno być realizowane w sposób hierarchiczny. Naj-
ważniejszą zaletą takiego rozwiązania jest wykorzysta-
nie mechanizmu automatycznego usuwania obiektów
gdy ich obiekty nadrzędne (parent) zostaną usunięte.
Dodatkowym warunkiem jego wykorzystania jest two-
rzenie obiektów na stercie – tzn. przy pomocy opera-
tora new . Więcej informacji na temat działania mechani-
zmu automatycznego zwalniania pamięci zawartych zo-
stało w paragrafie Hierarchia obiektów i jej znaczenie .
QWidget – klasa bazowa wszystkich widgetów
QWidget jest klasą bazową wszystkich widgetów: okien,
ramek, menu, przycisków oraz okien dialogowych. Do-
kładne omówienie wszystkich z nich w przyjętej formie
cyklu jest niemożliwe, jednak w poszczególnych czę-
ściach w przykładowych aplikacjach przedstawione
zostanie zastosowanie znacznej części z nich.
Biblioteka Qt pozwala na wykorzystanie dwóch me-
tod rozmieszczania widgetów w oknach – przy wyko-
rzystaniu układów (layoutów) oraz bezwzględnie (po-
przez określenie wymiarów i położenia). W praktyce
powinno się korzystać jedynie z pierwszej z nich – za-
pewnia to poprawne wyświetlanie GUI po zmianie roz-
miarów okna oraz w różnych rozdzielczościach.
Każda z klas dziedziczących po QWidget posiada me-
todę show() , która powoduje wyświetlenie jej instancji
w nowym oknie. W praktyce jednak rzadko się z niej ko-
rzysta – tworzenie graficznych interfejsów użytkownika
QDialog oraz QMainWindow
– podstawowe klasy okien
Większość aplikacji składa się z wielu okien – główne-
go okna aplikacji, okien dialogowych, okien ustawień
oraz okien informacyjnych. Biblioteka Qt zawiera klasy
służące do tworzenia każdego z nich oraz wiele klas
reprezentujących standardowe okna wykorzystywa-
ne we wszystkich aplikacjach: wyboru koloru i czcion-
ki ( QColorDialog , QFontDialog ), zapisu i odczytu pliku
( QFileSaveDialog , QFileOpenDialog ) oraz drukowania
( QPrintPreviewDialog ).
W tym oraz w następnym artykule zajmie-
my się szczegółowo dwoma klasami: QDialog oraz
Listing 1. Kod źródłowy konstruktora prostej klasy
dziedziczącej po QWidget prezentującej zastosowanie
layoutów
Listing 2. Fragment kodu prezentujący zastosowanie klas
QStackedWidget oraz QListWidget
SimpleWidget :: SimpleWidget ( QWidget * parent )
: QWidget ( parent )
{
/* Utworzenie layoutu i przycisków. */
QGridLayout * mainLayout = new QGridLayout ();
QPushButton * button1 = new QPushButton ( "One" );
QPushButton * button2 = new QPushButton ( "Two" );
QPushButton * button3 = new QPushButton ( "Three" );
QPushButton * button4 = new QPushButton ( "Four" );
QSplitter * splitterWidget = new QSplitter ();
QListWidget * selectList = new QListWidget ();
QStackedWidget * stackedWidget = new
QStackedWidget ();
QWidget * page1 = new QWidget ();
QWidget * page2 = new QWidget ();
QWidget * page3 = new QWidget ();
/* Dodanie przycisków do layoutu - numery
oznaczają
wiersz oraz kolumnę. Layout mainLayout
automatycznie
staje się rodzicem obiektów button1..button4.
*/
mainLayout -> addWidget ( button1 , 0 , 0 );
mainLayout -> addWidget ( button2 , 0 , 1 );
mainLayout -> addWidget ( button3 , 1 , 0 );
mainLayout -> addWidget ( button4 , 1 , 1 );
QStringList labels ;
labels << "First page" << "Second page" <<
"Third page" ;
selectList -> addItems ( labels );
stackedWidget -> addWidget ( page1 );
stackedWidget -> addWidget ( page2 );
stackedWidget -> addWidget ( page3 );
connect ( selectList , SIGNAL ( currentRowChanged ( i
nt )) ,
stackedWidget , SLOT ( setCurrentInd
ex ( int )));
/* Ustawienie layoutu widgetu SimpleWidget na
mainLayout.
SimpleWidget staje się rodzicem obiektu
mainLayout. */
this -> setLayout ( mainLayout );
}
splitterWidget -> addWidget ( selectList );
splitterWidget -> addWidget ( stackedWidget );
www.sdjournal.org
5
413821664.019.png 413821664.020.png 413821664.021.png 413821664.022.png 413821664.023.png 413821664.024.png 413821664.025.png 413821664.026.png 413821664.027.png
 
Zgłoś jeśli naruszono regulamin