Eseményvezérelt alkalmazások fejlesztése I. Tantárgyfelelős: Gregorics Tibor

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 1. előadás. Grafikus felület és eseményvezérlés, a Qt keretrendszer

Eseményvezérelt alkalmazások fejlesztése I. Tantárgyfelelős: Gregorics Tibor

Eseményvezérelt alkalmazások fejlesztése I 1. előadás. Grafikus felület és eseményvezérlés, a Qt keretrendszer. Giachetta Roberto

Elemi alkalmazások fejlesztése III.

Alkalmazott modul: Programozás 12. előadás. Grafikus felületű alkalmazások fejlesztése

Elemi alkalmazások fejlesztése III.

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

2. Beadandó feladat dokumentáció

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.

2. Beadandó feladat dokumentáció

Elemi alkalmazások fejlesztése III.

3D-s számítógépes geometria és alakzatrekonstrukció

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

3D-s számítógépes geometria és alakzatrekonstrukció

Elemi alkalmazások fejlesztése III

Eseménykezelés. Aszinkron kommunikáció

Grafikus Qt programok írása segédeszközök nélkül

Elemi alkalmazások fejlesztése III. A Qt assistant elindítása. Ajánlott ir odalom. A Qt assistant nyitó ablaka

Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál. Saját vezérlő használata tervezőben (worldclocks)

Hálózati alkalmazások

QLabel *label = new Qlabel("Hello Qt!",0);

Már megismert fogalmak áttekintése

Elemi alkalmazások fejlesztése III.

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Webes alkalmazások fejlesztése Bevezetés. Célkitűzés, tematika, követelmények. A.NET Core keretrendszer

Budapest, március. ELTE Informatikai Kar

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

Adatok speciális megjelenítése

A szerzõrõl... xi Bevezetés... xiii

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Adatkezelés speciális eszközökkel. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

Eseményvezérelt alkalmazások fejlesztése I 3. előadás. Dinamikus felületű alkalmazások. Giachetta Roberto

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

Elemi alkalmazások fejlesztése IV.

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

3. Beadandó feladat dokumentáció

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Eseménykezelés. Aszinkron kommunikáció

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Elemi alkalmazások fejlesztése III.

Bánsághi Anna 2014 Bánsághi Anna 1 of 31

Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

Programozás I. gyakorlat

Szoftvertechnolo gia gyakorlat

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

OPENCV TELEPÍTÉSE SZÁMÍTÓGÉPES LÁTÁS ÉS KÉPFELDOLGOZÁS. Tanács Attila Képfeldolgozás és Számítógépes Grafika Tanszék Szegedi Tudományegyetem

Programozási alapismeretek 4.

Objektum orientáltság alapjai A Java nyelv Fordítás - futtatás

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Iman 3.0 szoftverdokumentáció

Java felhasználói felület

Java I. A Java programozási nyelv

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 2/3

Elemi alkalmazások fejlesztése IV. Adatbáziskezel alkalmazás készítése QtDesignerben. Készítette: Szabóné Nacsa Rozália

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Kommunikációs rendszerek teljesítőképesség-vizsgálata

Grafikus Felhasználói Felületű (GUI) program készítése a QT Creatorral, illetve a Microsoft Visual Studio-val

Eseményvezérelt alkalmazások

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

Modell megvalósítása. Gregorics Tibor: Eseményvezérelt alkalmazások fejlesztése I.

Programozási technológia

Interfészek. PPT 2007/2008 tavasz.

Programozási Technológia előadás bevezetés. Előadó: Lengyel Zsolt

Gyakorlati vizsgatevékenység B

Java programozási nyelv 5. rész Osztályok III.

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Vizuális, eseményvezérelt programozás XI.

Webes alkalmazások fejlesztése. Bevezetés az ASP.NET MVC 5 keretrendszerbe

Concurrency in Swing

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

Könyvtári nyilvántartás

Qt rajzolás munkafüzet. Elemi Alkalmazások fejlesztése 3.

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Alkalmazások fejlesztése A D O K U M E N T Á C I Ó F E L É P Í T É S E

Grafikus felhasználói felületek, eseménykezelés

Swing GUI készítése NetBeans IDE segítségével

Elemi alkalmazások fejlesztése III

Eseményvezérelt alkalmazások fejlesztése I 2. előadás. Egyszerű, egyablakos alkalmazások

Akciók, diavetítés. 1. ábra Akciógombok. A lap két regiszterfülből áll, ezek a Kattintásra és az Áthaladáskor. Nézzük meg először az elsőt!

Szoftver labor III. Tematika. Gyakorlatok. Dr. Csébfalvi Balázs

Programozási technológia

Vállalati információs rendszerek I, MIN5B6IN, 5 kredit, K. 4. A meghirdetés ideje (mintatanterv szerint vagy keresztfélében):

Mobil Informatikai Rendszerek

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Webes alkalmazások fejlesztése

OOP #14 (referencia-elv)

Bevezetés a Programozásba II 5. előadás. Objektumorientált programozás és tervezés

Frontend készítés Qt alapokon

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás - Memóriajáték 1/2

Dinamikus felületű alkalmazások. Stílusok, időzítő, képek

Bevezető. Servlet alapgondolatok

Átírás:

Eseményvezérelt alkalmazások fejlesztése I. Tantárgyfelelős: Gregorics Tibor

Tantárgyról Cél: Objektum orientált módon felépített grafikus felületű, egy-, illetve többablakos, több rétegű, eseményvezérelt alkalmazások készítése Eszköz: Qt, C++, Linux, UML Előfeltétel: 2017/18 Programozás vagy Objektum elvű alkalmazások fejlesztése Előismeretek: Objektumelvű programozás, tervezés (UML) C++, nyelvi könyvtárak (STL) Előadás (heti 1 óra) Konzultációs gyakorlat (heti 1 óra) 2

Összevont számonkérés Kötelező házi feladatok egyenként 5 pontért: o 3 darab beadandó elkészítése: helyes (tesztelt) program + dokumentáció o Határidő: legfeljebb 3 hét késés, de legkésőbb a géptermi zárthelyi előtt hetenként 1 pont levonás, o személyesen kell bemutatni Géptermi zárthelyi 5 pontért: o félév végi évfolyam zh (egyszer ismételhető) o Használható az előadás honlapja, bármely írott/nyomtatott anyag, és a félév során leadott beadandók Gyakorlati jegy: o a beadandók, és a duplán számított zárthelyi eredményének átlaga 3

Háttér anyagok http://people.inf.elte.hu/gt/eva1 Előadások diái Házi feladatok (követelmények leírása, feladatsor, minta) Minta megoldások Qt : https://doc.qt.io Jasmin Blanchette, Mark Summerfield: C++ GUI programming with Qt 4, Prentice Hall, 2006. Giachetta Roberto anyagai: http://people.inf.elte.hu/groberto/elte_eva1/ 4

Qt keretrendszer Néhány szó a grafikus felületről, a Qt programok fordításáról, és bevezetés az eseménykezelésbe

A Qt egy platformfüggetlen alkalmazás-fejlesztési keretrendszer, amellyel nemcsak asztali, de akár mobil vagy beágyazott alkalmazások is fejleszthetők. Támogatást ad a grafikus felület, az adatbázis-kezelés, a multimédia, a 3D grafika, a hálózati és webes kommunikáció készítéséhez. Rendelkezik nyílt forráskódú (LGPL) és kereskedelmi verzióval is. Fejlesztő nyelve elsősorban a C++, de más nyelvekre is elérhető, valamint rendelkezik saját leíró nyelvvel (Qt Quick). A Qt 5.x keretrendszer, Qt Creator fejlesztőkörnyezet elérhető a https://www.qt.io/ oldalról. apt-get install qt-sdk 6

Fejlesztés nyelve és környezete A fejlesztés C++/Qt nyelven, Linux környezetben történik. Elérhető a teljes C++ utasításkészlet, nyelvi könyvtár. Számos C++ nyelven megszokott osztálynak létezik Qt-s megfelelője (QString, QQueue, stb.) Használhatunk olyan Qt-s makrókat, amelyeket a Meta Object Compiler (MOC) fordít le ISO C++ kódra. Az alapértelmezett fejlesztőeszköz a Qt Creator, de más környezetekben is lehetőség van a Qt fejlesztésre (pl. Code::Blocks, Visual Studio). Külön tervezőprogram (Qt Designer) áll rendelkezésre a grafikus felület létrehozásához, amely XML nyelven írja la felület felépítését. 7

Hello Qt alkalmazás #include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); // alkalmazás példányosítása QLabel mylabel("hello Qt!"); // címke a felirattal mylabel.show(); // címke megjelenítése } return app.exec(); // alkalmazás futtatása 8

Grafikus felületű alkalmazás Grafikus felületű alkalmazásnak nevezzük azt a programot, amely 2D-s interaktív felhasználói felületen (GUI, Graphical User Interface) keresztül kommunikál a felhasználóval A konzol felületnél lényegesen változatosabb interakciós lehetőséget biztosít a programfutásba történő beavatkozáshoz. A felület grafikus megjelenítéssel is ellátott vezérlőkből (control/widget) áll (mint például nyomógombok, listák, menük, stb.). Megjelenhetnek önállóan ablakként (form/window), vagy egy másik vezérlő részeként. Mindig van egy aktív ablak, és egy aktív vezérlő (ezen van a fókusz). A működését a felhasználói interakcióra történő várakozás jellemzi. 9

Példák GUI alkalmazásokra 10

Grafikus felület felépítése A grafikus felület objektumorientáltan épül fel. minden vezérlő egy objektum, amelyet az osztálya jellemez. Mivel a különféle vezérlők sok hasonló tulajdonsággal bírnak, így osztályaik öröklődési hierarchiába szervezhetők. Az öröklődési lánc legtetején áll az általános vezérlő osztálya, amelyből a többi vezérlő osztálya származik. A Qt keretrendszer az általános vezérlőt és az abból származtatott nevezetes vezérlőket tartalmazza, csak a saját, egyedi vezérlőink osztályait kell nekünk származtatással definiálni. A vezérlők elhelyezkedési hierarchiába rendeződnek aszerint, hogy egy vezérlő önállóan, azaz ablakként, vagy egy másik vezérlő részeként jelenik meg. 11

Grafikus felület osztályhierarchiája QObject QApplication QWidget QLayout QFrame QComboBox QButton QBoxLayout QLabel QLineEdit QPushButton QCheckBox QHBoxLayout 12

Grafikus felület osztályai QObject + staticmetaobject :QMetaObject {readonly} # d_ptr :QScopedPointer<QObjectData> # staticqtmetaobject :QMetaObject {readonly} + QObject(QObject*) + ~QObject() + event(qevent*) :bool + eventfilter(qobject*, QEvent*) :bool + tr(char*, char*, int) :QString + trutf8(char*, char*, int) :QString + metaobject() :QMetaObject * {query} + tr(char*, char*, int) :QString + tr(char*, char*) :QString + trutf8(char*, char*, int) :QString + trutf8(char*, char*) :QString + objectname() :QString {query} + setobjectname(qstring&) :void + iswidgettype() :bool {query} + signalsblocked() :bool {query} + blocksignals(bool) :bool + thread() :QThread * {query} + movetothread(qthread*) :void + starttimer(int) :int + killtimer(int) :void + findchild(qstring&) :T {query} + findchildren(qstring&) :QList<T> {query} + findchildren(qregexp&) :QList<T> {query} + children() :QObjectList & {query} + setparent(qobject*) :void + installeventfilter(qobject*) :void + removeeventfilter(qobject*) :void + connect(qobject*, char*, QObject*, char*, Qt::ConnectionType) :bool + connect(qobject*, QMetaMethod&, QObject*, QMetaMethod&, Qt::ConnectionType) :bool + connect(qobject*, char*, char*, Qt::ConnectionType) :bool {query} + disconnect(qobject*, char*, QObject*, char*) :bool + disconnect(qobject*, QMetaMethod&, QObject*, QMetaMethod&) :bool + disconnect(char*, QObject*, char*) :bool + disconnect(qobject*, char*) :bool + dumpobjecttree() :void + dumpobjectinfo() :void + setproperty(char*, QVariant&) :bool + property(char*) :QVariant {query} + dynamicpropertynames() :QList<QByteArray> {query} + registeruserdata() :uint + setuserdata(uint, QObjectUserData*) :void + userdata(uint) :QObjectUserData* {query} + destroyed(qobject*) :void + parent() :QObject * {query} + inherits(char*) :bool {query} + deletelater() :void # sender() :QObject * {query} # sendersignalindex() :int {query} # receivers(char*) :int {query} # timerevent(qtimerevent*) :void # childevent(qchildevent*) :void # customevent(qevent*) :void # connectnotify(char*) :void # disconnectnotify(char*) :void # QObject(QObjectPrivate&, QObject*) QWidget + setenabled(bool) :void + setdisabled(bool) :void + setwindowmodified(bool) :void + framegeometry() :QRect {query} + geometry() :QRect & {query} + normalgeometry() :QRect {query} + x() :int {query} + y() :int {query} + pos() :QPoint {query} + framesize() :QSize {query} + size() :QSize {query} + width() :int {query} + height() :int {query} + rect() :QRect {query} + childrenrect() :QRect {query} + childrenregion() :QRegion {query} + minimumsize() :QSize {query} + maximumsize() :QSize {query} + minimumwidth() :int {query} + minimumheight() :int {query} + maximumwidth() :int {query} + maximumheight() :int {query} + setminimumsize(qsize&) :void + setminimumsize(int, int) :void + setmaximumsize(qsize&) :void + setmaximumsize(int, int) :void + setminimumwidth(int) :void + setminimumheight(int) :void + setmaximumwidth(int) :void + setmaximumheight(int) :void + setupui(qwidget*) :void + sizeincrement() :QSize {query} + setsizeincrement(qsize&) :void + setsizeincrement(int, int) :void + basesize() :QSize {query} + setbasesize(qsize&) :void + setbasesize(int, int) :void + setfixedsize(qsize&) :void + setfixedsize(int, int) :void + setfixedwidth(int) :void +...() QPaintDevice «enumeration» RenderFlag DrawWindowBackground = 0x1 DrawChildren = 0x2 IgnoreMask = 0x4 «enumeration» InsertPolicy NoInsert InsertAtTop InsertAtCurrent InsertAtBottom InsertAfterCurrent InsertBeforeCurrent InsertAlphabetically «enumeration» SizeAdjustPolicy AdjustToContents AdjustToContentsOnFirstShow AdjustToMinimumContentsLength AdjustToMinimumContentsLengthWithIcon QComboBox + QComboBox(QWidget*) + ~QComboBox() + maxvisibleitems() :int {query} + setmaxvisibleitems(int) :void + count() :int {query} + setmaxcount(int) :void + maxcount() :int {query} + autocompletion() :bool {query} + setautocompletion(bool) :void + autocompletioncasesensitivity() :Qt::CaseSensitivity {query} + setautocompletioncasesensitivity(qt::casesensitivity) :void + duplicatesenabled() :bool {query} + setduplicatesenabled(bool) :void + setframe(bool) :void + hasframe() :bool {query} + findtext(qstring&, Qt::MatchFlags) :int {query} + finddata(qvariant&, int, Qt::MatchFlags) :int {query} + insertpolicy() :InsertPolicy {query} + setinsertpolicy(insertpolicy) :void + sizeadjustpolicy() :SizeAdjustPolicy {query} + setsizeadjustpolicy(sizeadjustpolicy) :void + minimumcontentslength() :int {query} + setminimumcontentslength(int) :void + iconsize() :QSize {query} + seticonsize(qsize&) :void + iseditable() :bool {query} + seteditable(bool) :void + setlineedit(qlineedit*) :void + lineedit() :QLineEdit * {query} + setvalidator(qvalidator*) :void + validator() :QValidator * {query} + setcompleter(qcompleter*) :void + completer() :QCompleter * {query} + itemdelegate() :QAbstractItemDelegate * {query} + setitemdelegate(qabstractitemdelegate*) :void + model() :QAbstractItemModel * {query} + setmodel(qabstractitemmodel*) :void + rootmodelindex() :QModelIndex {query} + setrootmodelindex(qmodelindex&) :void + modelcolumn() :int {query} + setmodelcolumn(int) :void + currentindex() :int {query} + currenttext() :QString {query} + itemtext(int) :QString {query} + itemicon(int) :QIcon {query} + itemdata(int, int) :QVariant {query} + additem(qstring&, QVariant&) :void + additem(qicon&, QString&, QVariant&) :void + additems(qstringlist&) :void + insertitem(int, QString&, QVariant&) :void + insertitem(int, QIcon&, QString&, QVariant&) :void + insertitems(int, QStringList&) :void +...() 13

Qt osztálykönyvtár A Qt nyelvi könyvtár osztályai egy ősosztály (QObject) leszármazottjai Jelentős részét teszik ki a vezérlők osztályai. Számos segédosztállyal rendelkezik, pl.: adatszerkezetek (QVector, QStack, QLinkedList, ) fájl és fájlrendszer kezelés (QFile, QTextStream, QDir, ) párhuzamosság és aszinkron végrehajtás (QThread, QSemaphore, QFuture, ) 14

Fordítás A fordítás projektszinten történik, az ehhez szükséges információk a projektfájlban (.pro) tárolódnak, amely tartalmazza a felhasznált modulokat, kapcsolókat, a forrásfájlok, erőforrások (pl. kép, szöveg,) listáját az eredmény paramétereket. A fordítás akár közvetlenül is elvégezhető a fordítóval: qmake project # könyvtár nevével azonos projektfájl létrehozása qmake # fordítófájl (makefile) előállítása a projektfájlból make # projekt fájlnak megfelelő fordítás és # szerkesztés végrehajtása 15

Fordítás lépései Qt fordító Qt felület leírás (XML) Qt XML fordító Qt kód (C++) Qt MOC fordító C++ kód C++ fordító gépi kód 16

Modulok A keretrendszer felépítése modularizált. A legfontosabb modulok: központi modul (QtCore) grafikus felület (QtGui), grafikus vezérlők (QtWidgets) adatbázis-kezelés (QtSQL) hálózat-kezelés (QtNetwork) A projektben használandó modulokat a projektfájlban kell megadnunk, pl.: QT += core gui widgets sql network Egy modul tartalmát egyszerre (pl. #include <QtGui>), vagy akár osztályonként is (pl. #include <QLabel>) betölthetjük az aktuális fájlba 17

Vezérlés Egy grafikus felületű alkalmazás vezérlését egy alkalmazás objektum (a Qt-ben a QApplication osztály példánya) látja el. Beállítja az alkalmazás szintű tulajdonságokat (megjelenés, elérési útvonal). Felügyeli az alkalmazás vezérlő objektumait, azokon belül a grafikus felület elemeit. A programfutás során bekövetkező különféle történéseket, akciókat (pl. billentyűzet-, vagy egérhasználat, egy objektum üzenete, stb.) eseményként értelmezi. Gondoskodik arról, hogy az események eljussanak azokhoz a vezérlőkhöz, amelyek megfelelően reagálhatnak az eseményre. 18

Akció Esemény Szignál Egy akció az alkalmazás működésétől függetlenül bekövetkező történés amely vagy a felhasználótól (érintőképernyő, billentyűzet, egér, stb.), vagy az alkalmazás egyik objektumától (pl. időzítő), vagy egy másik alkalmazástól származik, amely hatására a futó alkalmazás egy eseményt (event) generál. Pl. egy kattintás az egér jobbfülével generál egy egérgomb-lenyomás és egy egérgomb-felengedés eseményt. Az esemény egy vezérlőhöz eljutva kivált (emit) egy szignált (signal). Egy fókuszban levő nyomógomb esetén az enter billentyű lenyomásának eseménye is, de a gomb felületén történt egérgomb-lenyomás eseménye is a clicked() szignált váltja ki. A szignálhoz esemény-kezelő metódust, lehet rendelni. esemény: farokhúzás eseménykezelés: beállítástól függően elrendelhet ebédidőt, tűzriadót, vagy a munkanap végét szignál: vijjogás akció: zsinór rángatás 19

Események és szignálok Az események a QEvent osztályból származtatott objektumok. (pl: QMouseEvent) o A több, mint száz különféle esemény típust enum értékek azonosítják, amelyeket a QEvent::type() add meg. Pl: QEvent::KeyPress, QEvent::MouseButtonPress o Egy eseménynek lehetnek paraméterei (arguments). Pl. egérfül lenyomásakor: melyik fület nyomták le, mi az egérmutató pozíciója. Egy vezérlő szignáljait maga a vezérlő definiálja. Ne keverjük össze az esemény és a szignál fogalmait. o Ha csak felhasználunk egy vezérlőt, akkor a szignáljaival foglalkozunk, és megmondjuk, hogy melyik szignálhoz milyen eseménykezelőt akarunk társítani. o Ha új vezérlőt tervezünk és implementálunk, akkor az ahhoz érkező eseményekre koncentrálunk, és döntünk arról, hogy melyeket kell (közvetlenül vagy szignál kiváltásával) lekezelni. 20

Szignál kiváltása Egy szignál kiváltása olyan, mintha egy törzs nélküli void-os függvényt hívnánk meg, de valójában nem meghívjuk, hanem az emit utasítással kiváltjuk. o Ha van a szignálhoz társítva vele megegyező szignatúrájú metódus, akkor az hajtódik végre. o Ha nincs, akkor a szignál kiváltása üres programként viselkedik: nem okoz hibát, a szignált kiváltó esemény lekezeletlen marad. Egy szignál kiváltásnak lehetnek aktuális paraméterei, amelyet a szignálhoz rendelt eseménykezelő metódus formális paraméterváltozói vesznek át. (A formális paraméterlistának illeszkedni-e kell az aktuális paraméterekhez sorrendben, típusban, de darabszámban nem). Egy szignálhoz rendelt eseménykezelő metódusban mindig lekérdezhető a szignált kiváltó vezérlő objektum: a szignál küldője (sender). 21

Eseménykezelő társítása szignálhoz A szignál kiváltása igen rugalmassá teszi a vezérlő felhasználását, hiszen a vezérlő kódjának módosítása nélkül, futási időben tudjuk megváltoztatni egy esemény kezelését. Társítás során egy vezérlő szignálját összekötjük egy eseménykezelővel, amely egy tetszőleges objektum speciális (slot) metódusa kell legyen. A társítást végző connect bármelyik QObject leszármazott típus metódusaként jelen van, de statikus metódus hivatkozással is elérhető. Ennek paraméterei: a szignált kiváltó küldő objektum (sender) a szignált (SIGNAL) a fogadó objektum (receiver) A fogadó metódusaként definiált eseménykezelő (SLOT). Pl.: connect(&button, SIGNAL(clicked()), &app, SLOT(quit())); 22

Az eseménykezelés módjai Az eseményekre történő reagálás egyedivé alakítása történhetne o származtatással: egy létező vezérlő osztályából származtatunk egy új osztályt, és abban felüldefiniáljuk az eseménykezelő metódusokat. A vezérlő osztályába fordítási időben égetjük be az eseménykezelés. Nem szokták alkalmazni o objektum befecskendezéssel: átadjuk a vezérlőnek azt a megfigyelő objektumot, amelyik metódusa végzi az esemény kezelését. Futási időben létrehozott kapcsolat. Qt-ben ilyen metódus az eventfilter() o szignálokkal: az eseményvizsgáló metódusok az esemény hatására egy szignált (signal) váltanak ki, amelyre futási időben feliratkozthatnak olyan metódusok, az úgynevezett slot-ok, amelyek a szignált kiváltó eseményt lekezelik. Ezek a metódusok bármilyen akár a vezérlő által nem is ismert objektum metódusai is lehetnek. Futási időben létrehozott kapcsolat (nem objektum-orientált technológia). 23

Eseménykezelés szintjei Egy esemény feldolgozását az alkalmazás objektum irányítása mellett elosztott módon végzik a megfelelő sorrendben hívott eseménykezelő metódusok. Az alkalmazás objektum először a notify() metódusát futtatja. Ez gondoskodik arról, hogy az esemény a megfelelő (fókuszban levő vagy egér mutató alatti) vezérlőhöz eljusson. Egy vezérlőhöz az installeventfilter()metódussal rendelhetünk eseményfigyelő (monitoring) objektumokat (több vezérlőnek lehet közös megfigyelő objektuma is, sőt maga az alkalmazás objektum is ilyen objektum), és ezek eventfilter() metódusa végezhet előzetes eseményfeldolgozást. Egy vezérlő a hozzá eljutó eseményt az event() metódusával dolgozza fel, majd az esemény fajtájától függően lefut a mousepressevent(), vagy keypressevent(), vagy paintevent() kezelő is. Ha ezek valamelyike szignált is kivált, akkor a szignálhoz rendelt tevékenység (slot) végrehajtására kerül sor. notify() eventfilter() event() mouseevent(), keyevent(), 24

Quit alkalmazás #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); // alkalmazás QPushButton quit("quit"); // gomb quit.resize(75, 30); // méret quit.setfont(qfont("times", 18, QFont::Bold)); // betűtípus QObject::connect(&quit, SIGNAL(clicked()), &app, SLOT(quit())); quit.show(); // gomb megjelenítése } return app.exec(); 25