Programowanie w środowiskach RAD QtCreator, Qt i C++

Podobne dokumenty
Programowanie w środowiskach RAD Qt i C++

Qt - dialogi. Bogdan Kreczmer. ZPCiR ICT PWR pokój 307 budynek C3

Qt sygnały i designer

Qt - podstawowe cechy

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

Signals + Threads: Qt vs. Boost

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

Podstawy programowania w Qt4

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Praca z aplikacją designer

Projektowanie obiektowe. Roman Simiński Polimorfizm

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Dziedziczenie jednobazowe, poliformizm

Wykład 8: klasy cz. 4

Mechanizm sygnałów i slotów. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4. Sygnały i sloty - definicja klasy

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Wprowadzenie do tworzenia zaawansowanych interfejsów graficznych: QGraphics View Framework vs. QML. Jakub Bogacz. Patryk Górniak

Wykład 5 Okna MDI i SDI, dziedziczenie

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Klasy abstrakcyjne, interfejsy i polimorfizm

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Wstęp do Programowania 2

The Graphics View Framework. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. he Graphics View Framework - architektura

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Mechanizm dziedziczenia

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

TEMAT : KLASY DZIEDZICZENIE

Zaawansowane programowanie obiektowe - wykład 5

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Multimedia JAVA. Historia

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Wykład 5: Klasy cz. 3

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Aplikacje w środowisku Java

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Klasy abstrakcyjne i interfejsy

Programowanie obiektowe i zdarzeniowe

Definicje klas i obiektów. Tomasz Borzyszkowski

Szablony klas, zastosowanie szablonów w programach

Programowanie obiektowe

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Kurs WWW. Paweł Rajba.

Wykład 4: Klasy i Metody

Języki i metody programowania Java. Wykład 2 (część 2)

Materiały do zajęć VII

PARADYGMATY PROGRAMOWANIA Wykład 4

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

X Window System (I) Oprogramowanie i wykorzystanie stacji roboczych. Wykład 1. X Window System (III) X Window System (II)

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Wyjątki (exceptions)

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Język C++ Programowanie obiektowe

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

System X Window (I) Oprogramowanie i wykorzystanie stacji roboczych. Wykład 3. System X Window (III) System X Window (II)

10. Programowanie obiektowe w PHP5

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 3

Podstawy Programowania Obiektowego

Programowanie obiektowe

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Rok akademicki: 2014/2015 Kod: MIO s Punkty ECTS: 4. Poziom studiów: Studia I stopnia Forma i tryb studiów: -

Programowanie obiektowe

Enkapsulacja, dziedziczenie, polimorfizm

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wprowadzenie do programowanie obiektowego w języku C++

Programowanie w Internecie. Java

UML a kod. C++, Java i C#

Qt - edycja, obsługa zdarzeń, rozmieszczenie kontrolek

PROGRAMOWANIE OBIEKTOWE W C++ cz. 2. Dziedziczenie, operacje wej cia-wyj cia, przeładowanie operatorów.

Programowanie w języku C++ Grażyna Koba

Wprowadzenie do platformy Qt

Laboratorium nr 10. Temat: Funkcje cz.2.

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie obiektowe

Programowanie obiektowe

Technologie i usługi internetowe cz. 2

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

PHP 5 język obiektowy

Mechanizmy pracy równoległej. Jarosław Kuchta

Typy zmiennych proste i złożone. Programowanie komputerów. Tablica. Złożone typy zmiennych. Klasa. Struktura

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 12

Podstawy programowania w języku C++

Rozdział 4 KLASY, OBIEKTY, METODY

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Diagramy klas. dr Jarosław Skaruz

76.Struktura oprogramowania rozproszonego.

Programowanie obiektowe

Zaawansowane programowanie w języku C++ Klasy w C++

Instrukcja laboratoryjna cz.3

Szablony funkcji i klas (templates)

Programowanie w języku C++

Język C++ wykład VII. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VII. dr Jarosław Mederski. Spis.

Transkrypt:

Programowanie w środowiskach RAD QtCreator, Qt i C++ Roman Simiński roman.siminski@us.edu.pl www.siminskionline.pl Wprowadzenie do programowania w C++ z wykorzystaniem biblioteki Qt Sygnały i sloty

Sygnały i sloty motywacja Programowanie sterowane zdarzeniami wymaga określenia powiązania pomiędzy elementem generującym zdarzenie a elementem to zdarzenie obsługującym. W obrębie pojedynczej aplikacji GUI polega to zwykle na powiązaniu informacji o zdarzeniu związanym z elementem interfejsu, a podprogramem realizującym obsługę tego zdarzenia. W różnych środowiskach i bibliotekach GUI stosuje się różne metody realizacji takich powiązań. Najpopularniejsze jest przypisywanie podprogramów do dedykowanych handler'ów obsługi zdarzeń, co mniej lub bardzie bezpośrednio stanowi realizację mechanizmu wywołań zwrotnych (ang. call back). W Qt zastosowano mechanizm dynamicznego wiązania sygnałów (ang. signals) generowanych przez nadawcę z podprogramami obsługi, zwanymi slotami (ang. slots). Sloty i sygnały stanowią niestandardowe rozszerzenie języka C++ w Qt, są obsługiwane przez MOC. 2

Sygnały i sloty koncepcja Sloty i sygnały stanowią podstawę działania GUI, jednak ich zastosowanie nie ogranicza się tylko do zadań związanych z interfejsem. Sygnały mogą być emitowane przez elementy interfejsu (obiekty Qt), każdy element może emitować wiele sygnałów o różnych nazwach. 3

Sygnały i sloty koncepcja Każdy sygnał ma swoją nazwę, nazwy sygnałów mogą się powtarzać w różnych elementach. Przykładowy sygnał dla klasy QPushButton: clicked clicked clicked Sygnał emitowany przez element interfejsu 4

Sygnały i sloty koncepcja Sygnały wyemitowane przez elementy interfejsu powinny dotrzeć do odpowiednich podprogramów obsługi. Aby tak się stało, należy powiązać sygnały z podprogramami obsługi. clicked Void?calculate() } clicked void?clear() } Sygnał emitowany przez element interfejsu Podprogram obsługi 5

Sygnały i sloty koncepcja Powiązanie sygnał-podprogram obsługi realizuje funkcja connect. Aby takie powiązanie zadziałało, podprogram obsługi musi slotem specjalnie zdefiniowaną funkcją składową pewnej klasy. clicked connect void?calculate() } clicked connect void?clear() } Sygnał emitowany przez element interfejsu Podprogram obsługi 6

Sygnały i sloty koncepcja Sloty i sygnały są zgodne z koncepcją programowania obiektowego. Sygnał jest emitowany przez pewien obiekt Qt najczęściej jest to obiekt klasy interfejsowej, np. klasy QPushButton. Slot jest funkcją składową pewnego obiektu Qt często klasy interfejsowej, np. klasy reprezentującej okno, ale również klasy niezwiązanej z GUI. Obiekty klasy QPushButton class FuelWin : public QDialog Q_OBJECT private slots: void calculate(); void clear(); }; 7

Sygnały i sloty elementy Nadawca sygnału obiekt klasy Qt, emituje sygnał o określonej nazwie. Odbiorca sygnału obiekt klasy Qt, odbiera sygnał poprzez aktywowanie odpowiedniego slotu. Powiązanie para sygnał-slot, kojarząca sygnał nadawcy z odbiorcą. Nadawca Sygnał Emisja Powiązanie Nadawca Sygnał Odbiorca Slot Wywołanie slotu Slot Odbiorca 8

Czym jest slot? Jest funkcją składową pewnej klasy, zwykle jej rezultatem jest void. Jest implementowany i może być wywoływany jak zwykła funkcja składowa. Jest deklarowany w odmienny sposób w sekcji slots klasy: class JakasKlasa : public QObject Q_OBJECT public slots: void publicznyslot(); Mechanizm slotów i sygnałów działa dla obiektów klas pochodnych względem QObject protected slots: void zabezpieczonyslot(); private slots: void prywatnyslot(); }; 9

Dlaczego używamy slotów? Slot jest normalną funkcją C++, i może być wywoływany jak każda inna funkcja. Slot tym różni się od zwykłej funkcji, że może być wiązany z sygnałem (sygnałami), a wywołanie slota jest wynikiem emisji sygnału (sygnałów). Aby mechanizm slotów i sygnałów działał, konieczne jest wykorzystanie klasy bazowej QObject lub jej pochodnej. Program qmake aktywuje moc i realizuje odpowiednie przetworzenie slotów i sygnałów do postaci standardowych konstrukcji C++. 10

Czym jest sygnał? Sygnał jest komunikatem reprezentowanym w definicji klasy jak deklaracja funkcji o rezultacie void. Sygnał ma tylko deklarację, programista nie definiuje sygnału. Programista pisze nagłówek funkcji-sygnału nazwa sygnału oraz listę parametrów sygnału. Programista nie pisze ciała funkcji-sygnału ciało jest generowane automatycznie przez moc. Sygnały definiuje się w sekcji signals: class JakasKlasa : public QObject Q_OBJECT signals: void sygnalbezparametrow(); void sygnalzparametrami( int p ); }; Mechanizm slotów i sygnałów działa dla obiektów klas pochodnych względem QObject 11

Emisja sygnałów Emisja sygnału realizowana jest przez słowo kluczowe emit, stanowiące rozszerzenie Qt obsługiwane przez moc. Nadawca emitujący sygnał zazwyczaj nie wie, kto jest jego odbiorą. Emisja sygnału jest pewnego rodzaju rozgłoszeniem (ang. broadcast) informacji o zaistniałym zdarzeniu. Emisja sygnału ma konsekwencje powoduje uaktywnienie slota, o ile jakiś został do sygnału przywiązany. } emit clicked(); } emit clicked(); 12

Powiązanie sygnał-slot Powiązanie sygnał-slot realizowane poprzez wywołanie funkcji connect. Ta funkcja zdefiniowana jest w klasie QObject. Dla elementów GUI projektowanych w systemie QtDesigner, powiązania zapisywane są w odpowiednim pliku opisu unterfejsu *.ui. Powiązania mogą być ustanawiane i zrywane dynamicznie w czasie działania programu. QObject::connect( nadawca, SIGNAL( sygnatura ), odbiorca, SLOT( sygnatura ) ); Ponieważ syntaktycznie sygnały i sloty deklarowane są jak funkcje, ich sygnatury mają postać: nazwasygnalulubslotu( <lista argumentow> ) 13

Powiązanie sygnał-slot connect( ui->pushbuttoncalculate, SIGNAL( clicked() ), this, SLOT( calculate() ) ); connect( ui->pushbuttonclear, SIGNAL( clicked() ), this, SLOT( clear() ) ); class FuelWin : public QDialog Q_OBJECT private slots: void calculate(); void clear(); }; clicked() connect Sloty void FuelWin::calculate() } clicked() connect void FuelWin::clear() } ui->pushbuttoncalculate ui->pushbuttonclear Sygnały 14

Powiązanie sygnał-slot, parametry bool QObject::connect ( ); senderqobjectptr, SIGNAL( signalname(argumentlist)), receiverqobjectpointer, SLOT(slotName(argumentList)) OptionalConnectionType Powiązanie sygnał-slot mogą zawierać parametry: QLabel *label = new QLabel; QScrollBar *scrollbar = new QScrollBar; QObject::connect( scrollbar, SIGNAL( valuechanged( int ) ), label, SLOT( setnum( int ) ) ); Parametry mogą tylko zawierać typy argumentów, nie mogą zawierać nazw: QLabel *label = new QLabel; QScrollBar *scrollbar = new QScrollBar; Błędny zapis QObject::connect( scrollbar, SIGNAL( valuechanged( int n ) ), label, SLOT( setnum( int n ) ) ); 15

Powiązanie sygnał-slot, parametry Listy parametrów sygnału i slotu powinny sobie odpowiadać liczbą i typami. Dozwolone jest, gdy sygnał ma więcej parametrów, są one przy aktywowaniu slotu ignorowane. Sytuacja odwrotna jest niedozwolona jak mówi dokumentacja: Qt can ignore arguments, but not create values from nothing. Signals rangechanged(int,int) rangechanged(int,int) rangechanged(int,int) valuechanged(int) valuechanged(int) valuechanged(int) textchanged(qstring) clicked() clicked() Slots setrange(int,int) setvalue(int) updatedialog() setrange(int,int) setvalue(int) updatedialog() setvalue(int) setvalue(int) updatedialog() 16

Rozłączanie powiązania funkcja disconnect bool QObject::disconnect ( ); senderqobjectptr, SIGNAL( signalname(argumentlist)), receiverqobjectpointer, SLOT(slotName(argumentList)) OptionalConnectionType Szczególne przypadki: Odłączenie odłączenie powiązań od wszystkich sygnałów: disconnect( senderqobjectptr, 0, 0, 0 ); Odłączenie odłączenie powiązań od pewnego sygnału: disconnect( senderqobjectptr, SIGNAL( mysignal() ), 0, 0); Odłączenie konkretnego odbiorcy od nadawcy sygnału: Disconnect( senderqobjectptr, 0, receiverqobjectpointer, 0); 17

Przykład wykorzystania standardowych sygnałów i slotów Wykorzystanie standardowych sygnałów i slotów do powiązania elementu QSlider, QSpinBox jako elementów sterujących przeźroczystością okna. QSpinBox *spinbox QSlider *horizontalslider 18

Przykład wykorzystania standardowych sygnałów i slotów Zmiana wartości w obiekcie QSpinBox ma spowodować zmianę pozycji QSlider, zmiana pozycji obiektu QSlider ma spowodować zmianę wartości QSpinBox. connect ustaw wartość zmiana wartości connect zmiana wartości zmiana przeźroczystości ustaw wartość 19

Przykład wykorzystania standardowych sygnałów i slotów Zmiana wartości w obiekcie QSpinBox lub pozycji QSlider ma spowodować zmianę przeźroczystości okna (funkcja setwindowopacity). connect ustaw wartość zmiana wartości connect zmiana wartości zmiana przeźroczystości ustaw wartość connect 20

Przykład wykorzystania standardowych sygnałów i slotów Zmiana wartości w obiekcie QSpinBox lub pozycji QSlider ma spowodować zmianę przeźroczystości okna (funkcja setwindowopacity). connect setvalue( int ) valuechanged( int ) connect valuechanged( int ) setwindowopacity( qreal ) setvalue( int )? connect? 21

Przykład wykorzystania standardowych sygnałów i slotów Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) ui->setupui(this); // Powiazanie: zmiana pozycji suwaka zmiana wartosci spinbox'a connect( ui->horizontalslider, SIGNAL( valuechanged( int ) ), ui->spinbox, SLOT( setvalue( int ) ) ); // Powiazanie: zmiana wartosci spinbox'a zmiana pozycji suwaka connect( ui->spinbox, SIGNAL( valuechanged( int ) ), ui->horizontalslider, SLOT( setvalue( int ) ) ); } //??? Powiazanie: zmiana wartosci spinbox'a zmiana przezroczystosci connect( ui->spinbox, SIGNAL( valuechanged( int ) ), this, SLOT( setwindowopacity( qreal ) ) ); Niezgodność typów 22

Przykład wykorzystania standardowych sygnałów i slotów class Dialog : public QDialog Q_OBJECT public: explicit Dialog( QWidget *parent = 0 ); ~Dialog(); public slots: void settransparency( int val ); private: Ui::Dialog *ui; }; void Dialog::setTransparency( int val ) setwindowopacity( ( qreal )val / 100 ); } 23

Przykład wykorzystania standardowych sygnałów i slotów Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) ui->setupui(this); // Powiazanie: zmiana pozycji suwaka zmiana wartosci spinbox'a connect( ui->horizontalslider, SIGNAL( valuechanged( int ) ), ui->spinbox, SLOT( setvalue( int ) ) ); // Powiazanie: zmiana wartosci spinbox'a zmiana pozycji suwaka connect( ui->spinbox, SIGNAL( valuechanged( int ) ), ui->horizontalslider, SLOT( setvalue( int ) ) ); } // Powiazanie: zmiana wartosci spinbox'a zmiana przezroczystosci connect( ui->spinbox, SIGNAL( valuechanged( int ) ), this, SLOT( settransparency( int ) ) ); 24

Dziękuję za uwagę Pytania? Polemiki? Teraz, albo: roman.siminski@us.edu.pl