C++. Wykorzystaj potêgê aplikacji graficznych



Podobne dokumenty
PERSON Kraków

Microsoft Management Console

REJESTRATOR RES800 INSTRUKCJA OBSŁUGI

Instrukcja obsługi Norton Commander (NC) wersja 4.0. Autor: mgr inż. Tomasz Staniszewski

VinCent Office. Moduł Drukarki Fiskalnej

INSTRUKCJA DO PROGRAMU LICZARKA 2000 v 2.56

Opis obsługi systemu Ognivo2 w aplikacji Komornik SQL-VAT

dbsamples.udl lub przygotowany wcześniej plik dla Excela) i OK,

Dziedziczenie : Dziedziczenie to nic innego jak definiowanie nowych klas w oparciu o już istniejące.

Instalacja. Zawartość. Wyszukiwarka. Instalacja Konfiguracja Uruchomienie i praca z raportem Metody wyszukiwania...

Praca na wielu bazach danych część 2. (Wersja 8.1)

Bazy danych. Andrzej Łachwa, UJ, /15

Nowe funkcjonalności

Wdrożenie modułu płatności eservice dla systemu Virtuemart 2.0.x

Wtedy wystarczy wybrać właściwego Taga z listy.

Zarządzanie Zasobami by CTI. Instrukcja

Instrukcja programu PControl Powiadowmienia.

System Informatyczny CELAB. Przygotowanie programu do pracy - Ewidencja Czasu Pracy

Zdalne odnawianie certyfikatów do SWI

Tytuł pracy. Praca dyplomowa inżynierska. Filip Piechocki. Tytuł Imię i Nazwisko

Pracownia internetowa w każdej szkole. Opiekun pracowni internetowej SBS 2003 PING

Instrukcja obsługi platformy zakupowej e-osaa (klient podstawowy)

Pracownia internetowa w szkole podstawowej (edycja 2004)

Opis zmian funkcjonalności platformy E-GIODO wprowadzonych w związku z wprowadzeniem możliwości wysyłania wniosków bez podpisu elektronicznego

Konfiguracja historii plików

ECDL Advanced Moduł AM3 Przetwarzanie tekstu Syllabus, wersja 2.0

enova Workflow Obieg faktury kosztowej

Symfonia Produkcja Instrukcja instalacji. Wersja 2013

I. Zakładanie nowego konta użytkownika.

Instrukcja wprowadzania ocen do systemu USOSweb

Systemy mikroprocesorowe - projekt

Pierwsze kroki. Krok 1. Uzupełnienie danych własnej firmy

SZABLONY KOMUNIKATÓW SPIS TREŚCI

GEO-SYSTEM Sp. z o.o. GEO-RCiWN Rejestr Cen i Wartości Nieruchomości Podręcznik dla uŝytkowników modułu wyszukiwania danych Warszawa 2007

Zintegrowane Systemy Zarządzania Biblioteką SOWA1 i SOWA2 SKONTRUM

Instrukcja instalacji oraz wykorzystania podpisu cyfrowego

Pracownia internetowa w szkole podstawowej (edycja 2004)

INSTRUKCJA TESTOWANIA USŁUG NA PLATFORMIE ELA-ENT

Firma Informatyczna JazzBIT

PODRĘCZNIK UŻYTKOWNIKA

Rozliczenia z NFZ. Ogólne założenia. Spis treści

1. Podstawy budowania wyra e regularnych (Regex)

Kancelaris - Zmiany w wersji 2.50

Zaznaczając checkbox zapamiętaj program zapamięta twoje dane logowania. Wybierz cmentarz z dostępnych na rozwijalnej liście.

Aplikacje internetowe i rozproszone - laboratorium

Spring MVC Andrzej Klusiewicz 1/18

INTENSE BUSINESS INTELLIGENCE PLATFORM

Instrukcja. 1 Zamawiając kuriera. W Paczkomacie lub POK. 3 Nadając list polecony. nadawania przesyłek z Allegro: (Punkt Obsługi Klienta)

Centrum Informatyki "ZETO" S.A. w Białymstoku. Instrukcja użytkownika dla urzędników nadających uprawnienia i ograniczenia podmiotom w ST CEIDG

1. Korzyści z zakupu nowej wersji Poprawiono Zmiany w słowniku Stawki VAT Zmiana stawki VAT w kartotece Towary...

INSTRUKCJA KORZYSTANIA Z ELEKTRONICZNEJ ŚCIEŻKI WYKAZÓW

Moduł. Rama 2D suplement do wersji Konstruktora 4.6

MySource Matrix CMS - PROSTY INTERFEJS UŻYTKOWNIKA. INSTRUKCJA ver 1.2

Instrukcja instalacji programu Plantator oraz transferu pliku danych z/do PC kolektor danych PT-20

FlexDMS Aktualizacja 126

Instrukcja wgrywania synoptyki pola (wersja modelu danych do 634)

Warszawa, r.

ZAJĘCIA KOMPUTEROWE Kryteria ocen klasa IV

WSTĘP. Delphi. DDGX210(PL) - Edycja 1 du 01/

epuap Ogólna instrukcja organizacyjna kroków dla realizacji integracji

INTERAKTYWNA APLIKACJA MAPOWA MIASTA RYBNIKA INSTRUKCJA OBSŁUGI

SKRÓCONA INSTRUKCJA OBSŁUGI ELEKTRONICZNEGO BIURA OBSŁUGI UCZESTNIKA BADANIA BIEGŁOŚCI

Zmiany w programie C GEO v. 6.5

Pracownia internetowa w ka dej szkole (edycja 2004)

MUltimedia internet Instrukcja Instalacji

Przeniesienie lekcji SITA z płyt CD na ipoda touch

Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych ul. Koszykowa 75, Warszawa

Zainstalowana po raz pierwszy aplikacja wymaga aktualizacji bazy danych obsługiwanych sterowników.

Użytkowanie elektronicznego dziennika UONET PLUS.

INSTRUKCJA WebPTB 1.0

InsERT GT Własne COM 1.0

Przedmiot: Projektowanie dokumentów WWW. Laboratorium 3: Strona domowa cz. III Formularze. Opracował: Maciej Chyliński

Pracownia internetowa w ka dej szkole (edycja 2004/2005)

Praca z aplikacją designer

Zmiany w wersji 1.18 programu VinCent Office.

Centrum Informatyki "ZETO" S.A. w Białymstoku. Obsługa licencji, zaświadczeń i zezwoleń transportowych w systemie ProcEnt Licencje

PROGRAM NAUCZANIA INFORMATYKA

System zarządzania bazą danych (SZBD) Proces przechodzenia od świata rzeczywistego do jego informacyjnej reprezentacji w komputerze nazywać będziemy

SpedCust 5 instrukcja instalacji

Logowanie do mobilnego systemu CUI i autoryzacja kodami SMS

Zestaw skróconych instrukcji dotyczący najważniejszych operacji w programie Merkury Quattro.

Ćwiczenie 6.5. Otwory i śruby. Skrzynia V

1.Rysowanie wałka. Dostosowanie paska narzędzi Tworzenie nowego wałka. Uniwersytet Technologiczno Przyrodniczy w Bydgoszczy

Instrukcja dotycząca generowania klucza dostępowego do Sidoma v8

Analityka SAP ERP on HANA

Instrukcja wprowadzania danych do formularza importowego edziennika MobiReg wersja Light v.1.1

Rozdzia 3. Kalendarz wprowadzanie dat do arkusza Obs uga formularzy Uwagi dotycz ce obs ugi okien dialogowych kalendarza...

Microsoft Visual C : praktyczne przykłady / Mariusz Owczarek. Gliwice, cop Spis treści

Archiwum Prac Dyplomowych

Instrukcja obsługi. Oprogramowanie SAS 31

SINAMICS G120C STARTER. Tworzenie nowego projektu w trybie offline.

emszmal 3: Automatyczne księgowanie przelewów w menedżerze sprzedaży BaseLinker (plugin dostępny w wersji ecommerce)

Informacje o omawianym programie. Założenia programu omawianego w przykładzie

INFORMATOR TECHNICZNY WONDERWARE

OptiMore Importer Rejestru VAT. Instrukcja obsługi programu

Odliczenie w PFR PIT-37 ulgi na dzieci Tak Nie

System kontroli wersji SVN

2004 Heden Media. Wszelkie prawa zastrzeżone. Wirtualne laboratorium z napędów i sterowania pneumatycznego. Minimalne wymagania

Media Organizer v1.0b

Transkrypt:

C++. Wykorzystaj potêgê aplikacji graficznych Autor: Janusz Ganczarski, Mariusz Owczarek ISBN: 978-83-246-1473-8 Format: 158x235, stron: 448 Wydawnictwo Helion ul. Koœciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl Napisz wieloplatformowe programy w C++ Jak korzystaæ z bibliotek wxwidgets oraz Qt? W jaki sposób implementowaæ obs³ugê zdarzeñ w aplikacjach? Jak budowaæ aplikacje sieciowe i bazodanowe? Okres dominacji jednego systemu operacyjnego i przeznaczonych dla niego rozwi¹zañ powoli odchodzi do historii. Fenomen popularnoœci ró nych dystrybucji Linuksa i coraz mocniejsza pozycja komputerów Mac sprawiaj¹, e wiele firm produkuj¹cych oprogramowanie decyduje siê na tworzenie rozwi¹zañ wieloplatformowych. W przypadku ogromnych korporacji stworzenie zespo³ów programistycznych pracuj¹cych równolegle nad kilkoma wersjami jednej aplikacji dla ró nych systemów operacyjnych nie stanowi problemu, ale w mniejszych firmach jest to niemo liwe. Tu z pomoc¹ przychodz¹ biblioteki pozwalaj¹ce na tworzenie kodu Ÿród³owego prawid³owo kompiluj¹cego siê na ka dej platformie, na której je zainstalowano. Ksi¹ ka C++. Wykorzystaj potêgê aplikacji graficznych opisuje tworzenie oprogramowania z wykorzystaniem dwóch takich w³aœnie bibliotek wxwidgets oraz Qt. Czytaj¹c j¹, dowiesz siê, jak wykorzystaæ jêzyk C++ i œrodowisko Dev-C++ do pisania programów, z których korzystaæ bêd¹ mogli u ytkownicy systemu Windows, Linuksa i Mac OS. Nauczysz siê stosowaæ kontrolki i komponenty, budowaæ menu i interfejsy u ytkownika, obs³ugiwaæ zdarzenia i implementowaæ operacje graficzne. Przeczytasz tak e o aplikacjach bazodanowych i sieciowych. Ka de z zagadnieñ omówiono zarówno w kontekœcie biblioteki wxwidgets, jak i biblioteki Qt, dziêki czemu poznasz dwie metody rozwi¹zywania tych samych zadañ programistycznych by wybraæ sobie tê, która bardziej Ci odpowiada. Instalacja œrodowiska programistycznego i bibliotek Struktura aplikacji i podstawowe komponenty Stosowanie komponentów Obs³uga zdarzeñ myszy i klawiatury Budowanie menu aplikacji Komunikacja sieciowa Operacje graficzne Po³¹czenia z bazami danych Drukowanie z poziomu aplikacji Dziêki tej ksi¹ ce stworzysz aplikacje, które doceni¹ u ytkownicy wszystkich systemów operacyjnych.

Spis tre ci Rozdzia 1. Opis i instalacja bibliotek... 9 Wst p... 9 Biblioteka wxwidgets... 9 Instalacja rodowiska wxdev-c++... 10 Elementy wxdev-c++... 10 Tworzenie projektu aplikacji w wxdev-c++... 11 Biblioteka Qt... 12 Instalacja Dev-C++... 12 Instalacja bibliotek Qt... 12 Konfiguracja Dev-C++ do wspó pracy z Qt... 13 Tworzenie szablonu projektu aplikacji Qt... 15 Rozdzia 2. Struktura aplikacji wxwidgets... 19 Cz ci sk adowe aplikacji... 19 Zgodno ze standardem Unicode... 22 Tworzenie kontrolek... 23 Zdarzenia... 24 Wizualne tworzenie aplikacji w rodowisku wxdev-c++... 26 Struktura projektu wykorzystywana podczas budowy aplikacji za pomoc IDE... 27 Nazwy parametrów u yte w ksi ce... 28 Test... 28 Rozdzia 3. Podstawowe komponenty aplikacji... 31 Okno wxframe... 31 Style okna... 32 Ikona w oknie aplikacji... 33 Czcionki w aplikacji... 34 Panele wxpanel... 35 Przyciski wxbutton... 36 Etykieta wxstatictext... 38 Pola wyboru i przyciski opcji... 40 Komponent wprowadzania i edycji tekstu wxtextctrl... 44 Test... 48 Rozdzia 4. Wi cej o zdarzeniach... 49 Rodzaje zdarze... 49 Dynamiczna obs uga zdarze... 49 Rozpoznawanie obiektu generuj cego zdarzenie w metodzie obs ugi... 53

4 C++. Wykorzystaj pot g aplikacji graficznych Obs uga zdarze myszy... 56 Obs uga zdarze klawiatury... 58 Test... 61 Rozdzia 5. Zastosowania menu... 63 Podstawy menu... 63 Obs uga menu za pomoc tabeli zdarze... 66 Obs uga menu za pomoc metody Connect()... 68 Tworzenie menu podczas dzia ania aplikacji... 70 Menu kontekstowe... 73 Skróty klawiaturowe w opcjach menu... 75 Paski narz dzi... 77 Pasek statusu... 81 Test... 85 Rozdzia 6. Okna dialogowe... 87 Okna komunikatów... 87 Okno z mo liwo ci wprowadzania danych... 89 Zwyk e okno do wprowadzania tekstu... 89 Okno has a... 90 Okna zapisu i otwarcia pliku... 92 Okno wyboru czcionki... 94 Paleta kolorów... 96 Test... 98 Rozdzia 7. Podstawy aplikacji sieciowych... 101 Protokó FTP... 101 Logowanie do serwera i wy wietlanie zawarto ci katalogu... 101 Operacje na folderach i plikach... 105 Pobieranie plików z serwera... 107 Wysy anie plików z dysku lokalnego... 109 Protokó HTTP... 111 Pobieranie stron Web... 111 Wy wietlanie stron w postaci graficznej komponent wxhtmlwindow... 113 Prezentacja wyników dzia ania aplikacji w postaci HTML... 115 Komórki wxhtmlcell... 118 Test... 122 Rozdzia 8. Grafika... 125 Mapy bitowe wxbitmap... 125 Kontekst urz dzenia klasa wxdc... 126 Rysowanie w oknie kontekst wxclientdc... 128 Obs uga zdarzenia Paint kontekst wxpaintdc... 132 Rysowanie w pami ci wxmemorydc... 134 Kontekst ekranu wxscreendc... 136 Pióro wxpen... 138 P dzel wxbrush... 141 Podstawy obs ugi biblioteki OpenGL w wxwidgets... 143 Rysowanie obiektów trójwymiarowych... 147 Animacje... 149 Test... 151

Spis tre ci 5 Rozdzia 9. Aplikacje baz danych... 153 Bazy danych a wxwidgets... 153 Instalacja PostgreSQL... 153 Inicjalizacja bazy... 155 Organizacja i typy danych w bazach PostgreSQL... 156 J zyk SQL... 158 Po czenie aplikacji wxwidgets z baz danych... 158 Dodawanie tabel do bazy... 161 Zapis danych do tabeli... 165 Wyszukiwanie i odczyt danych z tabeli... 167 Zmiana warto ci w rekordach... 171 Test... 172 Rozdzia 10. Drukowanie w wxwidgets... 175 Drukowanie na ró nych platformach... 175 Drukowanie tekstu... 175 Drukowanie tekstu z formatowaniem... 178 Podgl d wydruku tekstu... 180 Drukowanie grafiki... 181 Obiekt wydruku wxprintout... 181 Urz dzenie drukarki klasa wxprinter... 183 Okno podgl du drukowania grafiki... 185 Skalowanie wydruku graficznego... 187 Test... 191 Rozdzia 11. Elementy aplikacji wielow tkowych... 195 Wielow tkowo... 195 Sekcje krytyczne... 196 Wzajemne wykluczenia... 196 Semafory... 196 Klasa wxthread... 196 Sekcja krytyczna wxcriticalsection... 198 Wykluczenie wxmutex... 199 Semafor wxsemaphore... 199 Prosta aplikacja z kilkoma w tkami... 200 Przekazywanie danych z w tku poprzez zdarzenia... 204 Ograniczenie ilo ci w tków za pomoc semafora... 205 Test... 207 Rozdzia 12. Struktura aplikacji Qt... 209 Korzystamy z szablonu... 209 Pierwszy program krok po kroku... 211 Wy wietlamy polskie znaki... 212 Podstawy hierarchii elementów interfejsu u ytkownika... 214 Tworzenie w asnej klasy okna... 216 Qt Designer... 218 Integracja Qt Designer i Dev-C++... 221 Wykorzystanie formularzy w programach... 222 Test... 228

6 C++. Wykorzystaj pot g aplikacji graficznych Rozdzia 13. Podstawowe komponenty aplikacji... 229 Klasa QMainWindow... 229 Rozpoczynamy budow edytora tekstu... 229 Rodzaje okien... 232 Ikona aplikacji i zasoby... 234 Menu... 236 Klawisze skrótu... 238 Komunikaty na pasku statusu... 239 Pasek statusu... 241 Pasek narz dzi... 242 Wygl d paska narz dzi... 242 Dodajemy w asne gniazda... 244 Edytor tekstu formularz w Qt Designer... 247 Klasa QString... 250 Test... 253 Rozdzia 14. Wi cej o zdarzeniach... 255 Sygna y i gniazda... 255 Metaobiekty... 255 Definiowanie gniazd... 256 Definiowanie oraz emitowanie sygna ów... 257 Kompilator MOC... 257 Definiowanie po cze... 258 Usuwanie po cze... 260 Dynamiczna obs uga po cze... 260 Program przyk adowy... 261 Obs uga zdarze... 262 Rodzaje zdarze... 263 Informacje przekazywane przy zdarzeniach... 263 Selektywna obs uga zdarze... 267 Test... 269 Rozdzia 15. Zastosowania menu... 271 Menu wielopoziomowe... 271 Zmiana parametrów czcionki w menu... 273 W a ciwo ci elementów menu, sygna y i gniazda... 276 Grupowanie elementów menu... 279 Menu podr czne programu... 282 Dynamiczne tworzenie elementów menu... 284 Test... 285 Rozdzia 16. Okna dialogowe... 287 Okna komunikatów... 287 Okna pobierania danych... 296 Okna narz dziowe... 299 Okno wyboru koloru... 300 Okno wyboru czcionki... 302 Obs uga plików i folderów... 303 Test... 306 Rozdzia 17. Podstawy aplikacji sieciowych... 307 Obs uga protokó u FTP... 307 Operacje na serwerze FTP... 307 Sygna y klasy QFtp... 309

Spis tre ci 7 Adresy zasobów internetowych... 309 Program przyk adowy... 311 Obs uga protokó u HTTP... 319 Operacje na serwerze HTTP... 319 Sygna y klasy QHttp... 321 Program przyk adowy... 321 Test... 326 Rozdzia 18. Grafika... 329 System graficzny w bibliotece Qt... 329 Uk ad wspó rz dnych i rasteryzacja prymitywów... 330 Podstawowe zasady rysowania... 332 Obs uga plików graficznych... 332 Parametry pióra... 339 Parametry p dzla... 346 Prymitywy graficzne... 348 Rysowanie napisów... 350 Jako renderingu... 353 OpenGL... 354 SVG... 359 Test... 364 Rozdzia 19. Wykorzystanie komponentów baz danych... 365 Bazy danych w bibliotece Qt... 365 Obs ugiwane bazy... 365 Instalacja i konfiguracja bazy danych Firebird 2.0... 366 Instalacja... 366 Kompilacja sterownika... 367 Utworzenie bazy... 368 Po czenie z baz danych... 369 Obs uga b dów... 370 Tworzenie tabel... 372 Podstawowe elementy j zyka SQL... 372 Wybrane typy danych... 372 Obs uga zapyta... 372 Dodawanie danych do tabel... 375 Wyszukiwanie danych... 376 Modyfikacja i usuwanie danych... 380 Test... 389 Rozdzia 20. Drukowanie pod Qt... 391 Urz dzenie graficzne do druku... 391 Klasa QPrinter... 391 Uk ad wspó rz dnych... 392 Podzia na strony... 393 Okna dialogowe obs uguj ce drukowanie... 393 Drukowanie tekstu... 394 Drukowanie rysunków... 395 Drukowanie do plików PDF... 397 Podgl d wydruku... 399 Test... 405

8 C++. Wykorzystaj pot g aplikacji graficznych Rozdzia 21. Programowanie wielow tkowe... 407 Podstawowe zagadnienia programowania wielow tkowego... 407 W tki w bibliotece Qt... 408 Uruchamianie i kontrola w tków... 409 Przerwanie i zatrzymanie w tku... 410 Sygna y klasy QThread... 410 Funkcja oczekuj ca... 411 Synchronizacja w tków... 411 Muteksy... 413 Semafory... 414 W tki w aplikacji GUI... 415 Test... 422 Dodatek A Odpowiedzi do testów... 423 Skorowidz... 425

Rozdzia 12. Struktura aplikacji Qt W pierwszym rozdziale po wi conym bibliotece Qt poznasz podstawowe zasady dotycz ce struktury aplikacji w tej e bibliotece. Utworzymy g ówne okno aplikacji, umie- cimy na nim pierwsze elementy graficznego interfejsu u ytkownika (GUI), zmierzymy si z problemem polskich znaków, aby w ko cu pozna podstawy obs ugi zdarze w bibliotece Qt. Nast pnie po krótkim wprowadzeniu do Qt Designera wykonamy tak sam prac ponownie, ale stosuj c to znakomite narz dzie z biblioteki Qt. Do tworzenia programów b dziemy korzysta z szablonu opisanego w rozdziale 1. Korzystamy z szablonu Przyk ad 12.1. Pierwszy program w Qt wykorzystanie szablonu aplikacji 1. Aby skorzysta z szablonu, wybierz z menu opcj Plik\Nowy Projekt i dalej w zak adce GUI wska szablon aplikacji Qt, tak jak to przedstawiamy na rysunku 12.1. Do ewentualnej zmiany pozostaje nazwa projektu. rodowisko Dev-C++ przyjmuje, e nowy projekt nazywa si po prostu Projekt i do tej nazwy dodaje mu kolejny numer. 2. Po wybraniu szablonu pliki projektu zapisz w wybranym folderze i w efekcie powiniene uzyska program analogiczny do przedstawionego na rysunku 12.2. Musisz jeszcze zapisa plik ród owy programu, ewentualnie zmieniaj c przy tym jego nazw z domy lnego main.cpp. Warto wspomnie jeszcze o jednej wa nej zasadzie obowi zuj cej przy zapisie projektów. Z uwagi na generowanie przy ka dym projekcie pliku Makefile.win zawieraj cego instrukcje dla narz dzia make, koniecznie zapisuj pliki projektów w odr bnych katalogach. W przeciwnym wypadku mo e doj do przypadkowej utraty zawarto ci tego pliku.

210 C++. Wykorzystaj pot g aplikacji graficznych Rysunek 12.1. Okno wyboru nowego projektu z szablonem aplikacji Qt 4.3.1 Rysunek 12.2. Widok rodowiska Dev-C++ po wygenerowaniu szablonu programu Qt 3. Oto tekst ród owy ca ego programu: #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app (argc, argv);

Rozdzia 12. Struktura aplikacji Qt 211 } Rysunek 12.3. Pocz tkowy wygl d okna pierwszego programu QPushButton button ("Hello world!"); button.resize (100, 30); button.show(); return app.exec(); 4. Kompilacja programu wymaga wybrania z menu opcji Projekt\Kompiluj i uruchom lub u ycia klawisza F9. W efekcie otrzymamy okno przedstawione na rysunku 12.3. Program nawi zuje do klasycznej postaci pierwszego programu, który w swojej karierze napisa o wielu programistów. Efekt jego dzia ania wprawdzie nie jest imponuj cy, ale pokazuje pot g biblioteki Qt, która w kilku wierszach kodu umo liwia wy wietlenie okna z przyciskiem. Pierwszy program krok po kroku Przeanalizujemy teraz krok po kroku kod ród owy programu wygenerowanego przez szablon. Dwa pocz tkowe wiersze programu: #include <QApplication> #include <QPushButton> w czaj pliki nag ówkowe biblioteki Qt zawieraj ce definicje klas QApplication i QPushButton. Pierwszej z nich u ywa ka dy program, który korzysta z graficznych elementów biblioteki Qt. Jej zadaniem jest inicjalizacja i zako czenie dzia ania programu, przetwarzanie p tli zdarze i umo liwienie ich obs ugi przez elementy graficznego interfejsu. Klasa ta dziedziczy po klasie QCoreApplication, która z kolei jest klas bazow dla programów pracuj cych w trybie konsoli (tekstowym). Klasa ta jest potomkiem klasy QObject, która jest baz wszystkich klas w bibliotece Qt. Druga klasa wykorzystywana w programie reprezentuje przycisk. Warto zauwa y, e nazwa pliku nag ówkowego odpowiada nazwie danej klasy. Zasada ta obowi zuje dla ka dej klasy biblioteki Qt nale cej do tzw. publicznej cz ci biblioteki i trzeba przyzna, e znakomicie u atwia prac. Jak wy ej wspominali my, QApplication jest bazow klas dla wszystkich programów korzystaj cych z biblioteki Qt, które pracuj w trybie graficznym. Parametry u ytego w programie konstruktora tej klasy: QApplication app (argc, argv); odpowiadaj standardowym argumentom funkcji main: int main(int argc, char *argv[]) Tak e w ostatnim wierszu programu korzystamy z klasy QApplication: return app.exec();

212 C++. Wykorzystaj pot g aplikacji graficznych Metoda exec przekazuje obs ug p tli zdarze, a tym samym dalsze sterowanie programem, do biblioteki Qt. Poza takimi wyj tkami jak okna komunikatów generowane przy u yciu klasy QMessageBox, wywo anie exec jest niezb dne do wy wietlenia graficznych elementów programu, czyli najcz ciej ca ego interfejsu aplikacji. Klasa QPushButton reprezentuje standardowy przycisk. Przycisk mo e, oprócz tekstu, zawiera tak e ikon. W programie tworzony jest przycisk zawieraj cy tekst wskazany jako parametr konstruktora klasy: QPushButton button ("Hello world!"); Po utworzeniu przycisku zmieniamy jego wymiary tak, aby napis w nim zawarty by w ca o ci widoczny w wy wietlanym oknie: button.resize (100, 30); Metoda resize, która to wykonuje, pochodzi z klasy QWidget b d cej baz wszystkich wizualnych elementów GUI w bibliotece Qt. Z tej samej klasy pochodzi metoda show, która wy wietla bie c kontrolk i wszystkie elementy pochodne: button.show(); Z obiektów klas dziedzicz cych po rednio lub bezpo rednio po klasie QWidget b dziemy wielokrotnie korzysta. Ich cech charakterystyczn, któr przedstawimy jeszcze w tym rozdziale, jest zdolno zarówno do samodzielnej pracy jako okno aplikacji (jak ma to miejsce w pierwszym przyk adzie), jak te jako jeden z elementów podrz dnych okna. W tym drugim przypadku za wy wietlenie ca ego okna odpowiedzialny jest obiekt b d cy najwy ej w hierarchii elementów okna. Warto tak e wiedzie, e ka dy obiekt klasy pochodnej po QWidget dziedziczy mo liwo pe nej obs ugi zdarze generowanych przez u ytkownika, w tym oczywi cie obs ug myszy i klawiatury. Wy wietlamy polskie znaki Niezb dn cech programów jest poprawna obs uga znaków charakterystycznych dla j zyka polskiego. Niestety, prosta zamiana napisu na przycisku z pierwszego przyk adu z angielskiego Hello world na polski odpowiednik Witaj wiecie da efekt przedstawiony na rysunku 12.4, na którym widoczny jest brak polskich liter. Rysunek 12.4. Przyk ad nieprawid owego kodowania polskich znaków Brak polskich znaków spowodowany jest sposobem obs ugi napisów przez bibliotek Qt, a szczególnie metod konwersji znaków. Napisy w bibliotece Qt obs uguje specjalizowana klasa QString (przedstawimy j bli ej w nast pnym rozdziale), która przechowuje dane, korzystaj c ze standardu Unicode 4.0. Jednak przy konwersji napisów klasa ta domy lnie u ywa standardu Latin 1, znanego tak e jako norma ISO 8859-1, który nie zawiera polskich znaków.

Rozdzia 12. Struktura aplikacji Qt 213 Zmiana domy lnego standardu kodowania wymaga u ycia statycznej metody setcodec ForCStrings klasy QTextCodec:, której parametrem jest nazwa wybranego standardu kodowania znaków. W przypadku j zyka polskiego najwa niejsze s dwa standardy kodowania znaków: Windows-1250 stosowany w systemach z rodziny Microsoft Windows oraz ISO 8859-2 u ywany w systemach Linux/Unix. Wybór jednego z tych dwóch standardów kodowania wygl da nast puj co: QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("Windows-1250")); QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("ISO-8859-2")); Biblioteka Qt obs uguje wiele standardów kodowania znaków, oprócz tak wa nych standardów jak ISO z rodziny 8859 (poza alfabetem tajskim) oraz standardów systemów z rodziny Windows, Qt obs uguje tak e standard Unicode w wersjach kodowania UTF-8 i UTF-16. Dzi ki tak obszernej liczbie obs ugiwanych standardów kodowania znaków biblioteka Qt umo liwia tworzenie programów wykorzystuj cych wszystkie najwa niejsze j zyki u ywane przez ludzko. Pe ny wykaz obs ugiwanych standardów kodowania znaków z ewentualnymi ograniczeniami dotycz cymi niektórych platform znajduje si w dokumentacji biblioteki. Powy sz wiedz wykorzystamy w kolejnym przyk adzie. Przyk ad 12.2. Wy wietlenie polskich znaków w bibliotece Qt Rysunek 12.5. Program poprawnie wy wietlaj cy polskie znaki 1. Utwórz nowy projekt, korzystaj c z szablonu aplikacji Qt, tak jak w poprzednim przyk adzie. 2. List plików nag ówkowych uzupe niamy tak, aby mo na by o u y klasy QTextCodec: #include <QTextCodec> 3. Wybór standardu kodowania polskich znaków najlepiej umie ci bezpo rednio po utworzeniu obiektu app: QApplication app (argc, argv); QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("Windows-1250")); 4. W nast pnym wierszu programu mo emy ju wpisa nowy tekst przycisku: QPushButton button ("Witaj wiecie!"); 5. Po kompilacji i uruchomieniu programu pojawi si okno, takie jak na rysunku 12.5.

214 C++. Wykorzystaj pot g aplikacji graficznych Podstawy hierarchii elementów interfejsu u ytkownika W typowym programie korzystaj cym z graficznego interfejsu u ytkownika okna aplikacji zawieraj wiele ró nego rodzaju elementów. Biblioteka Qt jest tak skonstruowana, e elementy GUI stanowi ce cz okna u o one s w odpowiedniej hierarchii. W pierwszej kolejno ci tworzony jest obiekt g ówny, potem budujemy obiekty klas b d cych cz ci sk adow danego okna. W dwóch pierwszych programach rol g ównego i zarazem jedynego elementu GUI stanowi przycisk obiekt klasy QPushButton. Ide hierarchii obiektów w bibliotece Qt najlepiej zilustruje nast pny przyk ad. Przyk ad 12.3. Hierarchia elementów GUI 1. Tradycyjnie utwórz nowy projekt, korzystaj c z szablonu aplikacji Qt (mo esz tak e wykorzysta projekt utworzony w drugim przyk adzie). 2. Dodaj plik nag ówkowy klasy QMainWindow, która b dzie klas bazow dla wi kszo ci naszych programów przyk adowych: #include <QMainWindow> 3. Po wierszach tworz cych obiekt klasy QApplication i definiuj cych obs ug wybranego standardu polskich znaków: QApplication app (argc, argv); QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("Windows-1250")); umie obiekt klasy QMainWindow reprezentuj cy okno aplikacji: QMainWindow window; Klasa QMainWindow potrafi obs ugiwa wszystkie typowe elementy g ównego okna aplikacji, w tym menu, paski narz dziowe oraz pasek statusu, ale mo na j tak e zastosowa do utworzenia innych rodzajów okien. W programie u yli my warto ci domy lnych konstruktora, który ma nast puj c posta : QMainWindow::QMainWindow (QWidget * parent = 0, Qt::WindowFlags flags = 0) Pierwszy parametr parent okre la wska nik do obiektu nadrz dnego (rodzica) w hierarchii elementów GUI. Domy lna warto oznacza, e dany obiekt jest g ównym obiektem w hierarchii. Drugi parametr, czyli flags, opiszemy dok adniej w nast pnym rozdziale. 4. Dalej okre l rozmiar i po o enie okna oraz podaj jego tytu : window.setgeometry (400,300,300,200); window.setwindowtitle ("Przyk ad 3"); Obie powy sze metody pochodz z klasy QWidget. Krótkiego wyja nienia wymaga tylko setgeometry, której dwa pierwsze parametry okre laj po o enie lewego górnego naro nika kontrolki wzgl dem elementu nadrz dnego. Gdy tworzymy g ówne okno, b d to wspó rz dne po o enia okna na pulpicie. Dwa ostatnie parametry okre laj rozmiary okna lub innego elementu GUI.

Rozdzia 12. Struktura aplikacji Qt 215 Zwró jeszcze uwag, e w poprzednich programach tytu okna okre la a automatycznie biblioteka Qt na podstawie nazwy pliku wykonywalnego programu. 5. Nast pnie utwórz przycisk i umie go we wcze niej utworzonym oknie: QPushButton button ("Wyj cie",&window); button.setgeometry (100,120,100,40); Je eli spojrzymy na definicj u ytego w tym przypadku konstruktora klasy QPushButton: QPushButton::QPushButton (const QString & text, QWidget * parent = 0) to zobaczymy, e drugi parametr jest odpowiednikiem pierwszego parametru konstruktora klasy QMainWindow. W dwóch pierwszych programach przyciski by y elementami g ównymi, st d drugi parametr konstruktora QPushButton mia warto domy ln, jednak w tym przypadku tworzymy element podrz dny i w tym miejscu podajemy wska nik do g ównego okna. Oczywi cie, tak e po o enie przycisku okre lone jest we wspó rz dnych okna nadrz dnego, a nie pulpitu. 6. Aby napis przycisku odpowiada wykonywanej przez niego funkcji, musisz jeszcze odpowiednio po czy sygna (zdarzenie) generowany po naci ni ciu przycisku z odpowiednim gniazdem (ang. slot), czyli metod, która b dzie wywo ana w wyniku naci ni cia przycisku. S u y do tego metoda connect klasy QObject. W naszym przyk adzie naci ni cie przycisku zako czy prac programu poprzez wywo anie metody quit klasy QApplication: QObject::connect (&button,signal (clicked()),&app,slot (quit())); Parametry tej funkcji tworz dwie pary. Pierwsza para okre la ród o i rodzaj sygna u (w naszym przyk adzie obiekt button i jego metod clicked), druga jego odbiorc i wywo ywane gniazdo (w przyk adzie obiekt app i jego metod quit). Bli ej mechanizm sygna ów i gniazd opiszemy w rozdziale 15. 7. Ostatni czynno ci zwi zan z oknem jest jego wy wietlenie, co realizuje poznana ju wcze niej metoda show: window.show (); Zauwa, e wykonujemy metod show dla g ównego obiektu w hierarchii elementów okna, czyli w tym przypadku dla obiektu klasy QMainWindow. Zadanie wy wietlenia elementów podrz dnych wykona g ówny element w hierarchii. 8. Po uzupe nieniu o znane ju z poprzednich programów zako czenie: return app.exec(); ca o tekstu ród owego programu wygl da nast puj co: #include <QApplication> #include <QPushButton> #include <QTextCodec> #include <QMainWindow>

216 C++. Wykorzystaj pot g aplikacji graficznych Rysunek 12.6. Przycisk umieszczony w oknie aplikacji int main(int argc, char *argv[]) { QApplication app (argc, argv); QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("Windows-1250")); QMainWindow window; window.setgeometry (400,300,300,200); window.setwindowtitle ("Przyk ad 3"); QPushButton button ("Wyj cie",&window); button.setgeometry (100,120,100,40); QObject::connect (&button,signal (clicked()),&app,slot (quit())); window.show (); return app.exec(); } Po kompilacji i uruchomieniu otrzymamy okno przedstawione na rysunku 12.6. Tworzenie w asnej klasy okna Ostatnim krokiem do poznania struktury aplikacji Qt jest utworzenie w asnej klasy okna. Podobnie jak w poprzednim przyk adzie, jako klas bazow wykorzystamy QMainWindow, ale nic nie stoi na przeszkodzie, aby elementy GUI tworzy na bazie klasy QWidget. Wybór QMainWindow podyktowany jest g ównie jej przygotowaniem do obs ugi standardowych elementów g ównych okien programów. Je eli taka funkcjonalno nie jest potrzebna, klas, któr poni ej opisujemy, mo na tak e zbudowa na bazie QWidget. Popatrzmy zatem na kolejny przyk ad. Przyk ad 12.4. W asna klasa okna 1. Ponownie skorzystaj z szablonu aplikacji Qt i zapisz projekt w nowym folderze. 2. Pliki nag ówkowe pozostaj takie, jak w poprzednim przyk adzie: #include <QApplication> #include <QPushButton> #include <QTextCodec> #include <QMainWindow> 3. Klas reprezentuj c okno nazwij MyWindow. Zawiera ona jedynie konstruktor, destruktor oraz jedno prywatne pole button wska nik na obiekt klasy QPushButton:

Rozdzia 12. Struktura aplikacji Qt 217 class MyWindow: public QMainWindow { public: MyWindow (); ~MyWindow (); private: QPushButton *button; }; 4. Konstruktor klasy MyWindow realizuje takie same zadanie jak program z poprzedniego przyk adu. Tworzone okno ma rozmiary 300 na 200 pikseli i zawiera jeden przycisk, którego naci ni cia zamyka okno i ko czy dzia anie ca ego programu: MyWindow::MyWindow (): QMainWindow () { setgeometry (400,300,300,200); setwindowtitle ("Przyk ad 4"); button = new QPushButton ("Wyj cie",this); button -> setgeometry (100,120,100,40); connect (button,signal (clicked()),qapp,slot (quit())); } Warto zwróci uwag na to, e obiekt reprezentuj cy przycisk tworzymy dynamicznie, a wska nikiem do obiektu klasy bazowej wzgl dem przycisku jest this. Drug zmian jest wykorzystanie w wywo aniu funkcji connect jako trzeciego parametru makra qapp, które przekazuje wska nik do obiektu klasy QApplication. Specjalne mechanizmy zawarte w bibliotece Qt uniemo liwiaj utworzenie wi cej ni jednego obiektu tej klasy. 5. Destruktor klasy MyWindow pozostaw pusty. Usuni cie elementów GUI tworzonych dynamicznie zostanie zrealizowane automatycznie przez obiekt b d cy najwy ej w hierarchii. MyWindow::~MyWindow () { } 6. Prezentowana poni ej funkcja main osi gn a posta, któr b dziemy stosowa w wi kszo ci programów przyk adowych: int main (int argc, char *argv[]) { QApplication app (argc, argv); QTextCodec::setCodecForCStrings (QTextCodec::codecForName ("Windows-1250")); MyWindow window; window.show (); return app.exec(); } Po wpisaniu ca o ci, kompilacji i uruchomieniu programu uzyskamy efekt niemal identyczny z efektem w poprzednim przyk adzie. Jedyna ró nica to inny tytu okna. Okno programu przedstawiamy na rysunku 12.7.

218 C++. Wykorzystaj pot g aplikacji graficznych Rysunek 12.7. Przycisk umieszczony w oknie reprezentowanym przez now klas Qt Designer Filozofia pracy i ogólny wygl d Qt Designera s zbli one do innych wizualnych edytorów graficznego interfejsu u ytkownika. Osoby znaj ce takie rodowiska jak Borland Delphi czy Microsoft Visual Basic znajd tu wiele podobie stw. Przy uruchomieniu Qt Designer standardowo wy wietla okno kreatora rodzaju tworzonego formularza tak jak to przedstawiamy na rysunku 12.8. Mo emy wybra okna dialogowe z przyciskami lub bez przycisków, okno g ówne oparte na klasie QMainWindow oraz dowoln kontrolk GUI na bazie klasy QWidget. Je eli wy czymy opcj wy wietlania kreatora nowego formularza, mo na go uruchomi z opcji menu File\NewForm. Rysunek 12.8. Qt Designer z otwartym oknem wyboru rodzaju tworzonego formularza

Rozdzia 12. Struktura aplikacji Qt 219 Po wyborze odpowiedniego rodzaju tworzonego formularza (w naszym przyk adzie jest to Main Window) otrzymujemy gotowy do pracy graficzny edytor interfejsu u ytkownika, którego przyk adowy wygl d przedstawiony jest na rysunku 12.9. Warto po- wi ci chwil czasu na wygodne ustawienie elementów edytora. Na pocz tku mo na zamkn cz okien proponuj pozostawi Widget Box, Property Editor oraz Object Inspector. Rysunek 12.9. Qt Designer w trakcie edycji formularza typu Main Window Przedstawione na rysunku 12.10 okno Widget Box zawiera palet elementów GUI (okno widoczne jest tak e w lewej cz ci rysunku 12.9). Wybran kontrolk przenosimy na okno formularza, korzystaj c z mechanizmu przeci gnij i upu. Widoczna na oknie siatka punktów u atwia rozmieszczanie poszczególnych elementów okna. W a ciwo ci wybranego elementu wy wietlane s w oknie Property Editor, które przedstawiamy na rysunku 12.11. Okno to zawiera informacje o klasie reprezentuj cej dany element oraz jej klasach bazowych. Na rysunku 12.12 widzimy, e wybranym elementem jest g ówne okno aplikacji (klasa QMainWindow, która dziedziczy po klasach QWidget i QObject). Wszystkie w a ciwo ci wy wietlane w oknie Property Editor maj oczywi cie swoje odpowiedniki w polach klasy.

220 C++. Wykorzystaj pot g aplikacji graficznych Rysunek 12.10. Okno Widget Box Ostatnim z podstawowych okien Qt Designera jest okno Object Inspector, które przedstawiamy na rysunku 12.12. Zawiera ono hierarchi klas bie cego projektu. W oknie prezentowanym na rysunku 12.12 zamie cili my pocz tkow hierarchi klas szablonu Main Window. Widzimy tu elementy klasy QMainWindow, takie jak centralna kontrolka okna (centralwidget), pasek menu (menubar) oraz pasek statusu (statusbar), które bli ej omówimy w nast pnym rozdziale.

Rozdzia 12. Struktura aplikacji Qt 221 Rysunek 12.11. Okno Property Editor Rysunek 12.12. Okno Object Inspector Integracja Qt Designer i Dev-C++ Qt Designer zapisuje opis formularzy w plikach z rozszerzeniem ui, które wykorzystuj sk adni XML. Biblioteka Qt zawiera specjalne narz dzie kompilator interfejsu u ytkownika UIC (ang. user interface compiler) które konwertuje pliki ui do

222 C++. Wykorzystaj pot g aplikacji graficznych plików nag ówkowych w j zyku C++. Do integracji w rodowisku Dev-C++ kompilatora UIC i innych specjalistycznych narz dzi biblioteki Qt wykorzystamy narz dzie qt-moc-ui-rcc. Plik wykonywalny qt-moc-ui-rcc.exe kopiujemy do folderu C:\Dev-Cpp\ bin, a plik qt.mak, zawieraj cy dodatkowe polecenia dla narz dzia make, umieszczamy w folderze z projektem. Ostatnim etapem konfiguracji jest dodanie pliku qt.mak w opcjach projektu Dev-C++ (menu Projekt\Opcje projektu) w zak adce Makefile, tak jak to przedstawiamy na rysunku 12.13. W przypadku plików formularzy automatycznie wygenerowany przez UIC plik nag ówkowy b dzie mia nazw tak sam jak plik ui (bez rozszerzenia) uzupe nion dodatkowo o przedrostek ui_. Rysunek 12.13. Dodanie pliku qt.mak do projektu Wykorzystanie formularzy w programach Wygenerowane za pomoc Qt Designera pliki formularzy mo na w stosunkowo atwy sposób wykorzysta w aplikacji. Dwa sposoby najcz ciej stosowne w praktyce prze- wiczymy na przyk adach. Pierwszym z nich b dzie u ycie wielodziedziczenia. Przyk ad 12.5. Formularz do czony za pomoc wielodziedziczenia 1. Korzystaj c z szablonu aplikacji Qt, utwórz nowy projekt. Funkcja main b dzie mia a tak sam zawarto jak w poprzednim przyk adzie. Mo esz tak e wykorzysta pliki z tego przyk adu. Klas MyWindow ogranicz do minimum: class MyWindow: public QMainWindow { public: MyWindow (); ~MyWindow () {} };

Rozdzia 12. Struktura aplikacji Qt 223 Rysunek 12.14. Oko Property Editor z wyró nionymi zmianami w a ciwo ci objectname, geometry i windowtitle Podobnie ograniczona do minimum jest implementacja konstruktora: MyWindow::MyWindow (): QMainWindow (0,Qt::Window) { } 2. W Qt Designerze utwórz nowy projekt formularza oparty na szablonie Main Window. Korzystaj c z edytora w a ciwo ci (okno Property Editor), zmodyfikuj nazw klasy (w a ciwo objectname) na Window, rozmiary okna (w a ciwo geometry) do 300 na 200 pikseli oraz dobierz odpowiedni tytu okna (w a ciwo windowtitle). Wst pnie przygotowany projekt zapisz pod nazw window.ui w folderze z projektem. Okno Property Editor z w a ciwo ciami naszej klasy Window przedstawiamy na rysunku 12.14. Warto jednocze nie zauwa y, e te w a ciwo ci klasy, których warto po modyfikacji odbiega od stanu pocz tkowego, wyró niane s w oknie Property Editor pogrubion czcionk.

224 C++. Wykorzystaj pot g aplikacji graficznych Rysunek 12.15. Struktura klas formularza zawieraj cego okno z jednym przyciskiem 3. Na formularzu okna umieszczamy przycisk obiekt klasy PushButton. Jego nazw zmieniamy na button, rozmiary i po o enie to kolejno: 100, 120, 100 i 40, a wy wietlany tekst (w a ciwo text) to Wyj cie. Struktura klasy formularza powinna wygl da tak, jak na rysunku 12.15. 4. Do uko czenia prac nad pierwszym formularzem pozosta o jeszcze wy czenie niepotrzebnego paska statusu oraz paska menu. Wybierz odpowiednie klasy w oknie Object Inspector i w a ciwo enabled ustaw na false. Dodatkowo dla paska statusu musisz wy czy jeszcze brzeg dla apki kursora myszy (w a ciwo sizegripenabled). W efekcie otrzymali my projekt formularza dok adnie odpowiadaj cy oknu z poprzedniego przyk adu. Plik window.ui wygl da nast puj co: <ui version="4.0" > <class>window</class> <widget class="qmainwindow" name="window" > <property name="geometry" > <rect> <x>0</x> <y>0</y> <width>300</width> <height>200</height> </rect> </property> <property name="windowtitle" > <string>qtdesigner - test</string> </property> <widget class="qwidget" name="centralwidget" > <property name="enabled" > <bool>true</bool> </property> <widget class="qpushbutton" name="button" > <property name="geometry" > <rect> <x>100</x> <y>120</y> <width>100</width> <height>40</height> </rect> </property> <property name="text" > <string>wyj cie</string> </property> </widget>

Rozdzia 12. Struktura aplikacji Qt 225 </widget> <widget class="qmenubar" name="menubar" > <property name="enabled" > <bool>false</bool> </property> <property name="geometry" > <rect> <x>0</x> <y>0</y> <width>300</width> <height>23</height> </rect> </property> </widget> <widget class="qstatusbar" name="statusbar" > <property name="enabled" > <bool>false</bool> </property> <property name="sizegripenabled" > <bool>false</bool> </property> </widget> </widget> <resources/> <connections/> </ui> 5. Do projektu do cz plik window.ui, a w opcjach projektu umie plik qt.mak i nast pnie skompiluj ca o. Przy pierwszej kompilacji w folderze z projektem zostanie utworzony dodatkowy plik ui_window.h, który zosta wygenerowany przez kompilator UIC. Plik ten do cz do projektu. Plik ui_window.h zawiera jednocze nie deklaracj i implementacj klasy Ui_Window: class Ui_Window { public: QWidget *centralwidget; QPushButton *button; QMenuBar *menubar; QStatusBar *statusbar; void setupui(qmainwindow *Window) { if (Window->objectName().isEmpty()) Window->setObjectName(QString::fromUtf8("Window")); Window->resize(300, 200); centralwidget = new QWidget(Window); centralwidget->setobjectname(qstring::fromutf8("centralwidget")); centralwidget->setenabled(true); button = new QPushButton(centralwidget); button->setobjectname(qstring::fromutf8("button")); button->setgeometry(qrect(100, 120, 100, 40)); Window->setCentralWidget(centralwidget); menubar = new QMenuBar(Window);

226 C++. Wykorzystaj pot g aplikacji graficznych }; menubar->setobjectname(qstring::fromutf8("menubar")); menubar->setenabled(false); menubar->setgeometry(qrect(0, 0, 300, 23)); Window->setMenuBar(menubar); statusbar = new QStatusBar(Window); statusbar->setobjectname(qstring::fromutf8("statusbar")); statusbar->setenabled(false); statusbar->setsizegripenabled(false); Window->setStatusBar(statusbar); retranslateui(window); QMetaObject::connectSlotsByName(Window); } // setupui void retranslateui(qmainwindow *Window) { Window->setWindowTitle(QApplication::translate("Window", "QtDesigner - test", 0, QApplication::UnicodeUTF8)); button->settext(qapplication::translate("window", "Wyj\305\233cie", 0, QApplication::UnicodeUTF8)); Q_UNUSED(Window); } // retranslateui Dodatkowo plik ten zawiera przestrze nazw Ui z klas Ui_Window: namespace Ui { class Window: public Ui_Window {}; } // namespace Ui 6. W definicji klasy dodaj dziedziczenie prywatne klasy wygenerowanej Ui::Window: class MyWindow: public QMainWindow, private Ui::Window Oczywi cie, na pocz tku pliku mywindow.h trzeba jeszcze do czy odpowiedni plik nag ówkowy: #include "ui_window.h" 7. W konstruktorze naszej klasy wywo aj metod setupui znajduj c si w klasie Ui::Window: setupui (this); Parametrem tej metody jest wska nik do obiektu klasy QMainWindow, czyli w naszym przypadku this. czymy tak e sygna wysy any przez przycisk button w dok adnie taki sam sposób jak w poprzednim przyk adzie. connect (button,signal (clicked()),qapp,slot (quit())) 8. Po kompilacji projektu i uruchomieniu programu uzyskamy okno, takie jak na rysunku 12.16.

Rozdzia 12. Struktura aplikacji Qt 227 Rysunek 12.16. Okno QMainWindow wygenerowane przy u yciu Qt Designera Drugim obok wielodziedziczenia typowym sposobem wykorzystania w programie formularzy wygenerowanych przez Qt Designer jest do czenie pola b d cego obiektem klasy wygenerowanej przez kompilator UIC. Ró nice w stosunku do wielodziedziczenia poka emy na przyk adzie. Przyk ad 12.6. Formularz do czony jako pole klasy 1. Skopiuj wszystkie pliki z poprzedniego przyk adu i otwórz plik projektu w Dev-C++. 2. W definicji klasy MyWindow dodaj pole window b d ce obiektem klasy Ui::Window. Jednocze nie usu dziedziczenie po klasie Ui::Window: class MyWindow: public QMainWindow { public: MyWindow (); ~MyWindow () {} private: Ui::Window window; }; 3. Konstruktor klasy MyWindow, podobnie jak w poprzednim przyk adzie, musi wywo a metod setupui klasy Ui::Window. Jedyna ró nica polega na innym sposobie dost pu do tej metody. Metod, zamiast bezpo rednio, wywo ujemy za po rednictwem pola window: window.setupui (this); Analogicznie modyfikujemy pierwszy parametr funkcji connect: connect (window.button,signal (clicked()),qapp,slot (quit())) 4. Po kompilacji i uruchomieniu programu otrzymujemy efekt analogiczny do efektu z przyk adu 12.5. Z dwóch przedstawionych metod wykorzystania formularzy generowanych przez Qt Designer najbardziej uniwersalna jest metoda druga. W przeciwie stwie do wielodziedziczenia, pozwala ona na bezproblemowe do czenie do jednej klasy aplikacji wielu formularzy. Jednak w typowych sytuacjach zastosowanie wielodziedziczenia jest najwygodniejsz metod, g ównie dzi ki bezpo redniemu dost powi do wszystkich elementów formularza.

228 C++. Wykorzystaj pot g aplikacji graficznych Test W ród pyta testowych dotycz cych powy szego rozdzia u poprawna jest co najmniej jedna odpowied. 1. Bazow klas okna aplikacji mo e by : a) QPushButton, b) QMainWindow, c) QWidget, d) QApplication. 2. Ile obiektów klasy QApplication mo e wyst pi w programie: a) dowolna ilo, b) tylko jeden, c) ilo obiektów zale y od ilo ci kontrolek. 3. Jakie domy lne kodowanie znaków obs uguje klasa QString: a) Latin 1, b) Windows 1250, c) ICO 8859-2. 4. czenie sygna ów i gniazd umo liwia metoda connect klasy: a) QWidget, b) QMainWindow, c) QApplication, d) QObject, e) QString. 5. Domy lna nazwa obiektu klasy QMainWindow formularza tworzonego przez Qt Designer to: a) MyWindow, b) MainWindow, c) Window, d) Widget.