, zasoby graficzne Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska Kurs: Copyright c 2019 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową., zasoby graficzne
Niniejsza prezentacja została wykonana przy użyciu systemu składu L A TEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net, zasoby graficzne
1 2, zasoby graficzne
Wprowdzanie napisów i liczb Obiekt klasy QLineEdit daje możliwość wprowdzenia tekstu. Nie ma on dodatkowych metod, które zapewniłyby weryfikację składni wprowadzanego tekstu.
Wprowdzanie liczb W przypadku wprowadzania liczb całkowitych, kontrolę poprawności wprowadzanych znaków może zapewnić obiekt klasy QSpinBox (dla liczb całkowitych) lub QDoubleSpinBox (dla liczb zmiennoprzecinkowych).
Przykład użycia QSpinBox i QDoubleSpinBox Kanwa : : Kanwa ( QWidget wrodzic ) : QWidget ( wrodzic ) {... QFormLayout worganizer = new QFormLayout ( t h i s ) ; QLabel wopis1 = new QLabel ( t r ( Wprowadz duza l i c z b e c a l k o w i t a : ), t h i s ) ; QSpinBox winputwnd1 = new QSpinBox ( t h i s ) ; winputwnd1 >setmaximum ( 100000000); QLabel wopis2 = new QLabel ( t r ( Wprowadz duza l i c z b e z m i e n n o p r z e c i n k o w a : ), t h i s ) ; QDoubleSpinBox winputwnd2 = new QDoubleSpinBox ( t h i s ) ; winputwnd2 >setmaximum ( 100000000); worganizer >s e t L a b e l A l i g n m e n t ( Qt : : A l i g n R i g h t ) ; worganizer >addrow ( wopis1, winputwnd1 ) ; worganizer >addrow ( wopis2, winputwnd2 ) ; s e t L a y o u t ( worganizer ) ; // To nie musi byc, gdyz j e s t juz w konstruktorze a d j u s t S i z e ( ) ;... }, zasoby graficzne
Przykład użycia QLineEdit i QIntValidator Kanwa : : Kanwa ( QWidget wrodzic ) : QWidget ( wrodzic ) {... QLabel wopis1 = new QLabel ( t r ( Wprowadz duza l i c z b e : ), t h i s ) ; QLineEdit winputwnd1 = new QLineEdit ( t h i s ) ; winputwnd1 >s e t V a l i d a t o r ( new Q I n t V a l i d a t o r ( ) ) ;... }, zasoby graficzne
Przykład użycia QLineEdit i QIntValidator Kanwa : : Kanwa ( QWidget wrodzic ) : QWidget ( wrodzic ) {... QLabel wopis1 = new QLabel ( t r ( Wprowadz duza l i c z b e : ), t h i s ) ; QLineEdit winputwnd1 = new QLineEdit ( t h i s ) ; winputwnd1 >s e t V a l i d a t o r ( new Q D o u b l e V a l i d a t o r ( ) ) ;... }, zasoby graficzne
Zestawienie weryfikatorów QIntValidator weryfikator dla liczb całkowitych. QDoubleValidator weryfikator dla liczb zmiennoprzecinkowych. QRegExpValidator weryfikator wykorzystujący wyrażenia regularne.
Przykład skojarzenia c l a s s Kanwa : p u b l i c QWidget { Q OBJECT p u b l i c : Kanwa ( QWidget wrodzic = n u l l p t r ) ; } ; Kanwa : : Kanwa ( QWidget wrodzic ) : QWidget ( wrodzic ) { QLineEdit wedycja = new W i e r s z E d y c j i ( t h i s ) ; wedycja >s e t V a l i d a t o r ( new Q I n t V a l i d a t o r ( t h i s ) ) ; }, zasoby graficzne
Przykład połączenia c l a s s Kanwa : p u b l i c QWidget { Q OBJECT p u b l i c : Kanwa ( QWidget wrodzic = n u l l p t r ) ; } ; Kanwa : : Kanwa ( QWidget wrodzic ) : QWidget ( wrodzic ) { QLineEdit wedycja = new W i e r s z E d y c j i ( t h i s ) ; wedycja >s e t V a l i d a t o r ( new Q I n t V a l i d a t o r ( t h i s ) ) ; }, zasoby graficzne
Opis zasobów skojarzone z daną aplikacją muszą znajdować się w pliku z rozszerzeniem *.qrc. Zawiera on opis w formacie XML dostępnych zasobów. Podawana ścieżka dostępu do pliku w opisie zasobów jest ścieżką względem kartoteki, w której znajduje się plik *.qrc. <!DOCTYPE RCC><RCC v e r s i o n= 1. 0 > <q r e s o u r c e> < f i l e>img/ l e d / l e d b l u e. png</ f i l e> < f i l e>img/ l e d / l e d g r e e n. png</ f i l e> < f i l e>img/ l e d / l e d l i g h t G r a y. png</ f i l e> < f i l e>img/ l e d / l e d r e d. png</ f i l e> < f i l e>img/ l e d / l e d y e l l o w. png</ f i l e> </ q r e s o u r c e> </RCC>, zasoby graficzne
mogą być skompilowane do binarnej formy i dostępne bezpośrednio w kodzie. Mogą również zostać w formie binarnej i zarejestrowane później przez system zarządzający zasobami. Dostęp do zasobów Ścieżka względna :/img/led/led green.png URL qrc:///img/led/led green.png Możliwe jest tworzenie skróconych odwołań poprzez aliasy < f i l e a l i a s= LED g r e e n. png >img/ l e d / l e d g r e e n. png</ f i l e> Dostęp do zasobów Ścieżka względna :/LED-green.png URL qrc:///led-green.png, zasoby graficzne
Wiele sekcji W danym pliku może być kilka sekcji opisujących zasoby. Można dodać prefiksy, które rozróżnią poszczególne sekcje. <!DOCTYPE RCC> <RCC v e r s i o n= 1. 0 > <q r e s o u r c e p r e f i x= LED > < f i l e a l i a s= g r e e n. png >img/ l e d g r e e n. png</ f i l e> </ q r e s o u r c e> <q r e s o u r c e p r e f i x= i c o n s > < f i l e>img/ f i l e. png</ f i l e> </ q r e s o u r c e> </RCC> Dostęp do zasobów :/LED/img/led green.png qrc:///led/img/led green.png :/LED/green.png :/icons/img/file.png, zasoby graficzne
Zróżnicowanie ze względu na lokalizację Tworzenie różnych sekcji może być wykorzystane do umieszczania zasobów, które będą zróżnicowane ze względu na używany język i lokalizację. <q r e s o u r c e> < f i l e>f l a g a. png</ f i l e> </ q r e s o u r c e> <q r e s o u r c e l a n g= en > < f i l e a l i a s= f l a g a. png >img/ f l a g e n. png</ f i l e> </ q r e s o u r c e> Dostęp do zasobów :/flaga.png qrc:///flaga.png, zasoby graficzne
Wkompilowywanie zasobów Wszystkie wykorzystywane zasoby możemy umieścić w kodzie aplikacji. Dzięki temu nie będzie ona wymagała dodatkowej informacji o lokalizacji zasobów. Aby to było możliwe, w projekcie aplikacji (plik *.pro) musi się pojawić odpowiedni wpis. Wpis w pliku *.pro RESOURCES = application.qrc Dodatkowy wpis powoduje utworzenie odpowiednich reguł w pliku Makefile (w dostarczanych przykładach jest to plik Makefile.app), które wymuszają uruchomienie programu rcc. Narzędzie to tworzy moduł qrc NazwaProgramu.cpp, w którym umieszczane są odpowiednie mapy bitowe w formacie XPM., zasoby graficzne
Przebieg przetwarzania zasobów, zasoby graficzne
Kompresja zasobów Program rcc domyślnie kompresuje zasoby. Można jednak ją wyłączyć wykorzystując parametr -no-compress. To może być użyteczne, gdy dołączamy zasoby, które już są skompresowane, np. pliki *.png Wywołanie program rcc rcc -no-compress zasoby.qrc Można też kontrolować poziom kompresji wykorzystując parametry -compress i -threshold Wywołanie program rcc rcc -compress 2 -threshold 3 zasoby.qrc, zasoby graficzne
Parametry wywołania programu rcc Jeżeli korzystamy z programu qmake do zbudowania wszystkich reguł (jest to najwygodniejsze), to parametry wywołania programu rcc można zadawać poprzez zmiennę QMAKE RESOURCE FLAGS. Wywołanie program rcc QMAKE RESOURCE FLAGS += -compress 2 -threshold 3 Inne zmienn programu qmake dla ustawień rcc RCC DIR kartoteka, w której znajdą się produkty kompilacji programu rcc. RESOURCES zbiór plików.qrc, zasoby graficzne
Odwołanie się do zasobów Z zasobów graficznych można skorzystać w obiektach takich klas jak QIcon, QImage, QPixmap. Przykład użycia QLabel Etykieta; Etykieta.setPixmap(QPixmap(":/flaga.png")); W pamięci komputera zasoby są przechowywane w strukturze drzewiastej. Struktura ta jest budowana automatycznie w momencie startu aplikacji. Do lokalizacji zasobu w tej strukturze wykorzystywane są obiekty QFile. Można też wykorzystać obiekt QDir. Inicjalizując go ścieżką ":/" można przeglądać i nawigować po całej strukturze drzewiastej zasobów. System zasobów wspiera również mechanizm zbioru automatycznie przeszukiwanych ścieżek. Odpowiednie ścieżki można dodawać wykorzystując metodę QDir::addSearchPath( )., zasoby graficzne
Użycie zasobów wewnątrz biblioteki Gdy zasoby są wykorzystywane w module bibliotecznym konieczne jest ich zainicjalizowanie. Należy to zrobić przed ich pierwszym użyciem. K l a s a W B i b l i o t e c e : : K l a s a W B i b l i o t e c e ( ) : KlasaBazowa ( ) { Q INIT RESOURCE ( z a s o b y ) ; // z a soby. q r c } Q F i l e P l i k ( : / f l a g a. dat ) ;..., zasoby graficzne
Użycie zasobów biblioteki w programie głównym Gdy zasoby biblioteki są wykorzystywane w programie głównym, to należy je tam zainicjalizować. i n t main ( i n t argc, char a r g v [ ] ) { Q A p p l i c a t i o n app ( argc, a r g v ) ; Q INIT RESOURCE ( g r a p h l i b ) ; } Q F i l e f i l e ( : / f l a g a. png ) ;... r e t u r n app. e x e c ( ) ; Ten typ inicjalizacji może być również wykonany w przypadku bibliotek dynamicznie ładowanych (plugin ów). Gdy są one zwalniane, zasoby należy jawnie usunąć wywołując polecenie Q CLEANUP RESOURCE()., zasoby graficzne
Koniec prezentacji Dziękuję za uwagę, zasoby graficzne