Eseményvezérelt alkalmazások fejlesztése I 4. előadás. Elemi grafika és egérkezelés

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 4. előadás. Elemi grafika és egérkezelés. Elemi grafika és egérkezelés Rajzolás grafikus felületen

Elemi grafika. Stílusok, időzítő, képek

Objektumok és osztályok. Az objektumorientált programozás alapjai. Rajzolás tollal, festés ecsettel. A koordinátarendszer

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

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

bool _freehand = false; QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató

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

Bevezetés a programozásba II 1. gyakorlat. A grafikus könyvtár használata, alakzatok rajzolása

BME MOGI Gépészeti informatika 14.

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

Egyéb 2D eszközök. Kitöltés. 5. gyakorlat. Kitöltés, Szöveg, Kép

Imagine Logo Tanmenet évfolyam

Tartalom Képernyő részei... 2

A Paint program használata

Java és web programozás

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

2. Beadandó feladat dokumentáció

Ugráló gomb oktatási segédlet Ugráló gomb

Widget-ünket a festők vásznáról Canvas-nak nevezzük el. Mit kell a widgetnek tudnia?

2. Beadandó feladat dokumentáció

QGIS tanfolyam (ver.2.0)

Grafikai lehetőségek

VII. Appletek, grafika

Elemi alkalmazások fejlesztése III.

3. Beadandó feladat dokumentáció

Transzformációk. Grafikus játékok fejlesztése Szécsi László t05-transform

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

Programozási környezetek

13. A Paint rajzolóprogram

A Vonallánc készlet parancsai lehetővé teszik vonalláncok és sokszögek rajzolását.

CAD-ART Kft Budapest, Fehérvári út 35.

Word VI. Lábjegyzet. Ebben a részben megadhatjuk, hogy hol szerepeljen a lábjegyzet (oldal alján, szöveg alatt).

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

Prezentáció, Diagramok, rajzolt objektumok. Szervezeti diagram

Rajz 01 gyakorló feladat

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

Eseményvezérelt alkalmazások fejlesztése II 3. előadás. Windows Forms dinamikus felhasználói felület, elemi grafika

Transzformációk. Szécsi László

Név Magasság Szintmagasság tető 2,700 koszorú 0,300 térdfal 1,000 födém 0,300 Fsz. alaprajz 2,700 Alap -0,800

Képek és grafikák. A Beszúrás/Kép parancsot választva beszúrhatunk képet ClipArt gyűjteményből, vagy fájlból. 1. ábra Kép beszúrása

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

Android Commander Felhasználói kézikönyv

Táblázatok. Táblázatok beszúrása. Cellák kijelölése

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

Programozás III GRAFIKA RAJZOLÁS SWING FELÜLETEN RAJZOLÁS GRAFIKA HASZNÁLATA. Rajzolni az awt csomag Graphics osztályának metódusaival tudunk.

Rajz 02 gyakorló feladat

Mechatronika segédlet 3. gyakorlat

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

Felhasználói Kézikönyv

BME MOGI Gépészeti informatika 15.

Elemi alkalmazások fejlesztése III.

Használati utasítás a Betafence.lib GDL könyvtár használatához

Programozási technológia I. programból! A Gomb4 megoldásból induljunk ki!

RAJZ1. vezetett gyakorlat

Táblázatok kezelése. 1. ábra Táblázat kezelése menüből

Új prezentáció létrehozása az alapértelmezés szerinti sablon alapján.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Bevezetés a QGIS program használatába Összeálította dr. Siki Zoltán

S Z E K S Z Á R D T É R I N F O R M A T I K A I R E N D S Z E R

Építésügyi Monitoring Rendszer (ÉMO) komplex működését biztosító településrendezési tervek digitalizálása EKOP /B kiemelt projekt megvalósítása

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Képszerkesztés. Letölthető mintafeladatok gyakorláshoz: Minta teszt 1 Minta teszt 2. A modul célja

Mechatronika segédlet 1. gyakorlat

Szerkesztés 2D eszközökkel

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása. Biztonságos adattípusok megvalósítása

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).

TABULÁTOROK TÁBLÁZATOK KÉSZÍTÉSE. A táblázatok készítésének lehetőségei:

Területi primitívek: Zárt görbék által határolt területek (pl. kör, ellipszis, poligon) b) Minden belső pont kirajzolásával (kitöltött)

OpenGL és a mátrixok

QGIS szerkesztések ( verzió) Összeállította: dr. Siki Zoltán verzióra aktualizálta: Jáky András

Bevezetés a Programozásba II 3. előadás. Biztonságos adattípusok megvalósítása

A MIMIO interaktív tábla használata. Dr. Boda István DRHE,

A GIMP festő és rajzolóeszközei

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

Programozási nyelvek 1. előadás

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

Programozás I. Grafika Eseménykezelés. Programozás I. 2. gyakorlat Interakció a grafikus felületen, tagfüggvények. Surányi Márton PPKE-ITK

Szöveges műveletek. Mielőtt nekikezdenénk első szövegünk bevitelének, tanuljunk meg néhány alapvető műveletet a 2003-as verzió segítségével:

Készítsen négy oldalas prezentációt az E CD bolt számára! Tervezze meg az emblémáját!

KidPad 1.0. Felhasználói kézikönyv

* Az eszköztáron látható menüpontok közül csak a felsoroltak esetén használható a Ctrl.

1. beadandó feladat: egyszerű grafikus felületű alkalmazás. Közös követelmények:

18. Szövegszerkesztők

Téglalap kijelölés opciói

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Szabadkai Műszaki Szakfőiskola. Web programozás. dr Zlatko Čović

Thermo1 Graph. Felhasználói segédlet

Területi primitívek: Zárt görbék által határolt területek (pl. kör, ellipszis, poligon)

Területi primitívek: Zárt görbék által határolt területek (pl. kör, ellipszis, poligon)

11. Balra zárt igazítás A bekezdés sorai a bal oldali margóhoz igazodnak. 12. Beillesztés

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

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

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

17. Többdokumentumos alkalmazások készítése..3 A többdokumentumos felület...3. A program elkészítése...27

Információ megjelenítés Számítógépes ábrázolás. Dr. Iványi Péter

Photofiltre használata KAP képek javításához

Máté: Számítógépes grafika alapjai

Választó lekérdezés létrehozása

Rajzoljunk a Flash programmal! FLASH ALAPOK I.

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése I 4. előadás Elemi grafika és egérkezelés 2016 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Rajzolás grafikus felületen Qt-ban a grafikus felhasználói felület tartalmát tetszőlegesen rajzolhatjuk, ezáltal egyedi megjelenítést adhatunk neki azaz primitív 2D-s alakzatokat (vonal, téglalap, ellipszis, ) helyezhetünk fel rá pl.: void MyWidget::paintEvent(QPaintEvent*) { QPainter painter(this); // rajzoló objektum painter.setpen(qt::blue); // toll beállítása painter.drawrect(rect()); // kék keret painter.drawtext(rect(), Qt::AlignCenter, "Hello World!"); // szöveg kirajzolása } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:2

Rajzolási felület A rajzolást egy megadott felületen végezzük mindenre rajzolhatunk, ami a QPaintDevice leszármazottja, így tetszőleges grafikus vezérlő (QWidget), kép (QPixmap) és a nyomtató (QPrinter) magát a kirajzolást az osztály paintevent(qpaintevent*) metódusa végzi, ezt felüldefiniálva adjuk meg az egyedi rajzolást automatikusan fut le, amikor a rendszer frissíti a megjelenítést az update() eseménykezelőn keresztül manuálisan is lehet futtatni (pl. időzítővel történő frissítés esetén szükséges) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:3

Rajzolási eszközök A rajzolásért egy rajzoló objektum felel, amely a QPainter típus példánya a konstruktornak átadjuk a rajzfelületet (általában az aktuális vezérlő), pl.: QPainter painter(this); // a rajzolási felület ez a vezérlő lesz beállítjuk a rajzolási tulajdonságokat (szín, vonaltípus, betűtípus,...) a set<paraméter>(<érték>) metódusokkal, (hatása a következő beállításig tart), pl.: painter.setbackground(<kitöltés>); // háttérszín painter.setfont(<betűtípus>); // szöveg esetén a betűtípus painter.setopacity(<mérték>); // átlátszóság ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:4

Rajzolási eszközök A rajzolást a draw<alakzat/szöveg/kép>( <elhelyezkedés, >) műveletekkel végezhetjük, alakzatoknál ez keretet és kitöltést rajzol (csak kitöltést fill<alakzat>( ) művelettel rajzolhatunk), pl.: painter.drawrect(10, 30, 50, 30); // 50x30-as téglalap kirajzolása a // (10,30) koordinátába painter.fillrect(20, 40, 50, 30); // keret nélküli téglalap kirajzolása painter.drawtext(20, 50, "Hello"); // szöveg a (20,50) koordinátába a műveletek sorrendben futnak le, egymásra rajzolnak a rajzolás az alakzat bal felső sarkától indul (kivéve szöveg) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:5

Ecsetek és tollak Külön befolyásolhatjuk az alakzatot kitöltését és keretét a keretet, szöveget toll (QPen) segítségével készítjük, amely lehet egyszínű, de tartalmazhat szaggatásokat, nyilakat, a kitöltést ecset (QBrush) segítségével készítjük, amely lehet egyszínű, adott mintájú, textúrájú, pl.: painter.setpen(qt::darkgreen); // 1 vastag sötétzöld toll painter.setpen(qpen(qcolor(qt::blue), 4, Qt::DotLine)); // 4 vastag pöttyös kék toll painter.setbrush(qbrush(qcolor(250, 53, 38), Qt::CrossPattern)); // rácsos vöröses ecset ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:6

Rajzolási koordináták A rajzolást úgynevezett logikai koordináták segítségével végezzük, ezek határozzák meg az alakzat sarokpontjait QRect(1,2,6,4) QLine(2,7,6,1) a rendszer áttranszformálja az adatokat fizikai koordinátákká (viewport) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:7

Rajzolási koordináták A rajzolási műveletek az alakzatot a megfelelő képpontok koordinátáira igazítják drawrect(1,2,6,4); drawline(2,7,6,1); amennyiben a toll vastagsága páratlan, jobbra és lefelé tolódik az elhelyezés ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:8

Rajzolási koordináták Lehetőségünk elsimítást alkalmazni a rajzoláskor, ekkor minden esetben a logikai koordinátán helyezkedik el a rajz drawrect(1,2,6,4); drawline(2,7,6,1); ehhez a rajzoló setrenderhint(qpainter:: Antialiasing) üzemmódját kell beállítanunk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:9

Példa Feladat: Készítsünk egy alkalmazást, amelyben egy célkeresztet helyezünk az ablak közepére. A célkeresztet két vonallal és egy körrel jelenítjük, szaggatott-pöttyözött piros színnel, míg a hátteret pöttyös zöld ecsettel festjük meg. felüldefiniáljuk az ablak paintevent metódusát, létrehozunk benne egy rajzobjektumot (painter) először kitöltjük a hátteret a fillrect utasítással, majd meghúzzuk a függőleges és vízszintes vonalakat (drawline), végül a közepére állítunk egy ellipszist (drawellipse) a rajzolások közben megfelelően állítjuk a tollat és az ecsetet (az ecsetet kikapcsoljuk az ellipszis rajzolása előtt) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:10

Példa Megvalósítás (crosshairwidget.cpp): void CrosshairWidget::paintEvent(QPaintEvent *) { QPainter painter(this); // rajzoló objektum painter.setrenderhint(qpainter::antialiasing); // élsimítás használata QPen dashdotredpen(qbrush(qcolor(255, 0, 0)), 2, Qt::DashDotLine); // pontozott-szaggatott vonalú piros toll QPen solidredpen(qbrush(qcolor(255, 0, 0)), 3); // sima piros toll QBrush greenbrush(qcolor(0, 255, 0), Qt::Dense1Pattern); // pöttyös zöld ecset ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:11

Példa Megvalósítás (crosshairwidget.cpp): painter.setbrush(greenbrush); // ecset állítás painter.fillrect(0, 0, width(), height()); // háttér kitöltése } painter.setpen(dashdotredpen); // toll állítás painter.drawline(0, height() / 2, width(), height() / 2); // vonalak kirajzolása painter.drawline(width() / 2, 0, width() / 2, height()); painter.setpen(solidredpen); // toll állítás painter.drawellipse(width() / 2-30, height() / 2-30, 60, 60); // kör kirajzolása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:12

Transzformációk Alapból a rajzoló objektum a megadott vezérlő koordinátarendszerében dolgozik, de lehetőségünk van ennek affin transzformálására (worldtransform) forgatás (rotate(<szög>)) méretezés (scale(<vízszintes>, <függőleges>)) áthelyezés (translate(<vízszintes>, <függőleges>)) ferdítés (shear(<vízszintes>, <függőleges>)) Az így keletkezett ablak (window) koordináták és a fizikai (viewport) koordináták között újabb megfeleltetést létesíthetünk, más transzformációkkal (azaz két lépcsős a transzformáció) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:13

Transzformációk minden leképezés transzformációs mátrixok alkalmazásával történik logikai koordináták affin transzformációk ablak koordináták ablak-fizikai leképezés fizikai koordináták ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:14

További rajzolási lehetőségek A hátteret külön állíthatjuk (background), ekkor a teljes rajzfelület változik, a rárajzolt tartalom törölhető is (erase()) Amennyiben több tulajdonság beállítását is elvégezzük a rajzolás során, lehetőségünk van korábbi beállítások visszatöltésére a save() művelettel elmenthetjük az aktuális állapotot, a restore() művelettel betölthetjük az utoljára mentettet A rajzolás tartalmát megvághatjuk téglalap (clipregion), vagy egyéni alakzat (clippath) alapján Több rajzot is összeilleszthetünk különböző műveleti sémák szerint (compositionmode) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:15

Példa Feladat: Készítsünk egy analóg órát, amely mutatja az aktuális időt. az aktuális idő mutatásához időzítőt használunk és mindig lekérdezzük az aktuális időt (QTime::currentTime()) az óra és perc mutatókat háromszögből rajzoljuk ki (drawconvexpolygon, némi áttetszéssel), és a megfelelőhelyre forgatjuk (rotate), hasonlóan forgatjuk a többi jelölőt és mutatót, de azok már vonalak lesznek az egyszerűbb forgatás és helyezés érdekében eltoljuk (translate) és méretezzük (scale) a koordinátarendszert, hogy az ablak közepén legyen az origó ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:16

Példa Megvalósítás (analogclockwidget.cpp): AnalogClockWidget::AnalogClockWidget(QWidget *parent) : QWidget(parent) { QTimer *timer = new QTimer(this); // időzítő connect(timer, SIGNAL(timeout()), this, SLOT(update())); // az időzítő meghívja az update-t, ami a // paintevent-t timer->start(1000); // azonnal elindítjuk 1 másodperces // késleltetéssel } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:17

Példa Megvalósítás (analogclockwidget.cpp): void AnalogClockWidget::paintEvent(QPaintEvent *){ QTime time = QTime::currentTime(); // idő painter.save(); // tulajdonságok elmentése painter.setpen(qt::nopen); // nincs toll painter.setbrush(hourcolor); // ecset színe painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0))); // mutató forgatása painter.drawconvexpolygon(hourtriangle, 3); // poligon kirajzolása painter.restore(); // rajzolás visszaállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:18

Egérkezelő műveletek Az egérkezelés (követés, kattintás lekérdezése) bármely vezérlő területén elvégezhető, műveletek felüldefiniálásával 4 eseménykezelő áll rendelkezésünkre: egér lenyomása (mousepressevent) és felengedése (mousereleaseevent) egér mozgatása (mousemoveevent) dupla kattintás (mousedoubleclickevent) Minden eseménykezelő MouseEvent paramétert kap, amely tartalmazza az egér pozícióját lokálisan (pos()) és globálisan (globalx(), globaly()), illetve a használt gombot (button()) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:19

Egérkezelő műveletek Az egérkövetés alapértelmezetten csak lenyomott gomb mellett működik, de ez átállítható állandóra a mousetracking tulajdonság állításával Pl.: class MyWidget { protected: void mousepressevent(mouseevent* event); void mousereleaseevent(mouseevent* event); void mousemoveevent(mouseevent* event); void mousedoubleclickevent(mouseevent* event); // minden egéreseményt kezelünk } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:20

Billentyűkezelő műveletek Az egérkövetésnek megfelelően van lehetőségünk billentyűzetkövetésre is, pontosabban billentyű lenyomásának (keypressevent) és felengedésének (keyreleaseevent) kezelésére a paraméter (QKeyEvent) tartalmazza a billentyűt (key) pl.: class MyWidget { protected: void keypressevent(qkeyevent* event); void keyreleaseevent(qkeyevent* event); // billentyűesemények kezelése } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:21

Példa Feladat: Módosítsuk a célkereszt megjelenítő programunkat úgy, hogy kövesse az egeret, és egérgombra, illetve szóköz billentyűre lehessen lőni is, amit úgy jelenítünk meg, hogy egy fekete X-et rajzolunk a helyére. felüldefiniáljuk az egér/billentyű lenyomás és egér követés eseményeket és beállítjuk, hogy mindig kövesse az egeret (setmousetracking(true)), az egérpozíciót elmentjük (mouselocation) minden egérmozgásnál frissítjük a kijelzőt (update()), kattintásnál elmentjük az aktuális pozíciót egy vektorba (hitpoints) a kirajzolásnál az elmentett pontokat is kirajzoljuk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:22

Példa Tervezés: CrosshairWidget QWidget - hitpoints :QVector<QPoint> - mouselocation :QPoint + CrosshairWidget(QWidget*) + ~CrosshairWidget() # keypressevent(qkeyevent*) :void # mousemoveevent(qmouseevent*) :void # mousepressevent(qmouseevent*) :void # paintevent(qpaintevent*) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:23

Példa Megvalósítás (crosshairwidget.cpp): void CrosshairWidget::mousePressEvent(QMouseEvent *event){ hitpoints.append(event->pos()); // új pont felvétele update(); // képernyő frissítése } void CrosshairWidget::mouseMoveEvent(QMouseEvent *event){ mouselocation = event->pos(); update(); } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:24

Példa Megvalósítás (crosshairwidget.cpp): void CrosshairWidget::paintEvent(QPaintEvent *){ foreach(qpoint point, hitpoints){ // kirajzoljuk a pontokat painter.drawline(point.x() - 10, point.y() - 10, point.x() + 10, point.y() + 10); painter.drawline(point.x() - 10, point.y() + 10, point.x() + 10, point.y() - 10); } painter.drawellipse(mouselocation.x() - 30, mouselocation.y() - 30, 60, 60); // kör kirajzolása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:25

Kurzorkezelés Az egérkezelő műveletektől függetlenül is bármikor használhatjuk az egérpozíciót, kurzorkezelés (QCursor) segítségével a kurzor mindig az egérpozícióval egybeeső helyen van, amely lekérdezhető, és beállítható (QCursor::pos()) a kurzornak módosítható a kinézete (pl. nyíl, kéz, homokóra, ), vagy beállítható tetszőleges kép, pl.: widget.setcursor(qcursor(qt::busycursor)); // homokóra beállítása a vezérlőre A kurzortól lekért pozíció globális, de minden vezérlőnél van lehetőségünk leképezni a lokális koordinátarendszerbe a QWidget::mapFromGlobal(<pozíció>) művelettel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:26

Példa Feladat: Módosítsuk a célkereszt megjelenítő programunkat úgy, hogy a kurzorpozíció alapján jelenítse meg a célkeresztet, továbbá maga az egérkurzor is legyen egy célkereszt. a konstruktorban módosítjuk a kurzormegjelenést (setcursor(qt::crosscursor)) mivel nincs egérkövetés, nem tudunk egéreseményre reagálva rajzolni, ezért időzítő segítségével meghatározott időközönként (0.01 másodperc) frissítjük a képernyőt, és mindig lekérjük a kurzorpozíciót a rajzolásnál az egér/billentyű lenyomás eseményét megtartjuk, ebben továbbra is felvesszük az új lövéseket ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:27

Példa Tervezés: CrosshairWidget QWidget - hitpoints :QVector<QPoint> - timer :QTimer* + CrosshairWidget(QWidget*) + ~CrosshairWidget() # keypressevent(qkeyevent*) :void # mousepressevent(qmouseevent*) :void # paintevent(qpaintevent*) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:28

Példa Megvalósítás (crosshairwidget.cpp): void CrosshairWidget::paintEvent(QPaintEvent *){ QPoint mouselocation = QCursor::pos(); // egérpozíció lekérdezése a képernyőn mouselocation = QWidget::mapFromGlobal(mouseLocation); // egérpozíció transzformálása az ablakra ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:29