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

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

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

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.

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

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

Imagine Logo Tanmenet évfolyam

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

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

A Paint program használata

Java és web programozás

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

2. Beadandó feladat dokumentáció

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

QGIS tanfolyam (ver.2.0)

Grafikai lehetőségek

2. Beadandó feladat dokumentáció

VII. Appletek, grafika

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

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.

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

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

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

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

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

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

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.

Rajz 02 gyakorló feladat

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

Felhasználói Kézikönyv

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!

Mechatronika segédlet 3. gyakorlat

RAJZ1. vezetett gyakorlat

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

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

Elemi alkalmazások fejlesztése III.

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

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.

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

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

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

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:

É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

Mechatronika segédlet 1. gyakorlat

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

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

Szerkesztés 2D eszközökkel

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)

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

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

A GIMP festő és rajzolóeszközei

BME MOGI Gépészeti informatika 15.

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

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

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:

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

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

18. Szövegszerkesztők

Téglalap kijelölés opciói

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

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

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

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

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

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)

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

OpenGL és a mátrixok

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

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

Programozási nyelvek 1. előadás

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

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

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

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

Alkalmazott Modul III 6. gyakorlat. Objektumorientált programozás: öröklődés és polimorfizmus

Rajzoljunk a Flash programmal! FLASH ALAPOK I.

MŰSZAKI IGAZGATÓSÁG. GoWebEye alkalmazás felhasználói kézikönyv. v 1.0

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

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése I 4. előadá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á 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) 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:3 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) 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ú, 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:5 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:6 1

Rajzolási A rajzolást úgynevezett logikai segítségével végezzük, ezek határozzák meg az alakzat sarokpontjait Rajzolási A rajzolási műveletek az alakzatot a megfelelő képpontok koordinátáira igazítják QRect(1,2,6,4) QLine(2,7,6,1) drawrect(1,2,6,4); drawline(2,7,6,1); a rendszer áttranszformálja az adatokat fizikai ká (viewport) 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:7 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:8 Rajzolási Lehetőségünk elsimítást alkalmazni a rajzoláskor, ekkor minden esetben a logikai koordinátán helyezkedik el a rajz 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. drawrect(1,2,6,4); drawline(2,7,6,1); 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) ehhez a rajzoló setrenderhint(qpainter:: Antialiasing) üzemmódját kell beállítanunk 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:9 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:10 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 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:11 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:12 2

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) és a fizikai (viewport) 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 affin transzformációk ablak ablak-fizikai leképezés fizikai 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 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 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 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:17 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:18 3

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) 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 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 Tervezés: 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:23 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:24 4

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 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:25 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:26 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. Tervezés: 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 ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 4:28 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 5