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

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

Elemi alkalmazások fejlesztése III.

2. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció

Elemi alkalmazások fejlesztése III.

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ó

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

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

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

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

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

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

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

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

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

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

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

Programozási technológia

BME MOGI Gépészeti informatika 18. Grafika, fájlkezelés gyakorló óra. 1. feladat Készítsen alkalmazást az = +

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

Összetett alkalmazások

Eseménykezelés. Aszinkron kommunikáció

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

Elemi alkalmazások fejlesztése III.

Programozási technológia

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

A Java nyelv. Dialógus ablakok. Elek Tibor

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

BME MOGI Gépészeti informatika 6.

Szöveges fájlok szerkesztése Jegyzettömb használata

Tájékoztató. Használható segédeszköz: -

Thermo1 Graph. Felhasználói segédlet

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

Gyorsított jegybeírás. Felhasználói dokumentáció verzió 2.0.

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

GenerikusOsztály<objektumtípus> objektum = new GenerikusOsztály<objektumtípus>();

BME MOGI Gépészeti informatika 14.

Az image objektum. Az image eseménykezel i. Képek el zetes betöltése. Feladat. Váltóképek készítése

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

inels timer Működési elv:

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Képek és grafikák használata

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája

OOP. Alapelvek Elek Tibor

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Összetett grafikus felületű alkalmazások. Giachetta Roberto

Tájékoztató. Használható segédeszköz: -


Entity Framework alapú adatbáziselérés 2

Form1 Form Size 400;400 Text Mozgó kör timer1 Timer Enabled True Interval 100

Eseményvezérelt alkalmazások fejlesztése I 5. előadás. Grafikus felületű alkalmazások architektúrája. Grafikus felületű alkalmazások architektúrája

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

Tantárgyfelosztás. I. Ellenőrzés. Mielőtt hozzákezd a tantárgyfelosztás tervezéséhez, ellenőrizze le, illetve állítsa be a következőket:

Felhasználói útmutató a portal.nakvi.hu oldalhoz

Budapest, március. ELTE Informatikai Kar

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

Táblázatkezelés, Diagramkészítés. Egyéb műveletek

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

A WORDPRESS TESTRESZABÁSA (MEGJELENÉS MENÜ ELEMEI)

1.1.1 Dátum és idő függvények

Aromo Szöveges értékelés normál tantárggyal

RAJZ1. vezetett gyakorlat

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

Ügyviteli rendszerek hatékony fejlesztése Magic Xpa-val mobilos funkciókkal kiegészítve. Oktatók: Fülöp József, Smohai Ferenc, Nagy Csaba

Nemzeti LEADER Kézikönyv LEADER HELYI FEJLESZTÉSI STRATÉGIA FELHASZNÁLÓI KÉZIKÖNYV szeptember

Téradatbázisok használata QGIS-ből A DB kezelő modul 2.2 verzió

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

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

Eseményvezérelt alkalmazások fejlesztése II 10. előadás. Window Runtime alapismeretek. Windows Runtime alapismeretek A Windows Runtime

HVK Adminisztrátori használati útmutató

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

Online naptár használata

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

LEADER. Helyi Fejlesztési Stratégiák. tervezését támogató alkalmazás

Johanyák Zsolt Csaba: Grafikus felület programozása. Copyright 2008 Johanyák Zsolt Csaba

Matlab alapok. Baran Ágnes. Baran Ágnes Matlab alapok Elágazások, függvények 1 / 15

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

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

PHP-MySQL. Adatbázisok gyakorlat

QGIS tanfolyam (ver.2.0)

Vizuális programozás gyakorlat

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

Dokumentum létrehozása/módosítása a portálon:

Nokia N97_mini (Mail for Exchange) beállítása Virtualoso levelezésre

Elemi Alkalmazások Fejlesztése Beadandó Feladat Juhász Ádám

ArcGIS 8.3 segédlet 5. Dr. Iványi Péter

3. Osztályok II. Programozás II

Ozeki Weboffice. 1. ábra

APB mini PLC és SH-300 univerzális kijelző Általános használati útmutató

A számítógép beállításainak megváltoztatása

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

3. Beadandó feladat dokumentáció

Felhasználói útmutató (Adott programverzióhoz érvényes)

CMS videó megjelenítő szoftver használata

FELHASZNÁLÓI KÉZIKÖNYV XMAP (EXTENDED MAP) KEZELÉSI ÚTMUTATÓ (TATABÁNYA VÁROS KÖZLEKEDÉSE)

JOGI STÁTUSZ KEZELÉS MŰKÖDÉSE

Aromo Szöveges értékelés kódolt tantárggyal

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

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése I 3. előadás Dinamikus felületű alkalmazások Giachetta Roberto http://people.inf.elte.hu/groberto

A felhasználói felület típusai Az alkalmazásaink grafikus felülete alapvetően kétféle lehet: statikus: az alkalmazás felületén lévő vezérlők rögzítettek, azaz mindig ugyanazon vezérlők jelennek meg a vezérlőket a felülettervezővel, vagy a kódban a konstruktorral hozzuk létre dinamikus: futás közben változhatnak a megjelenő vezérlők, illetve tulajdonságaik a vezérlőket kódban, futás közben esemény hatására hozzuk létre és helyezzük el a felületen a változó mellett lehet állandó része is a felületnek rögzített vezérlőkkel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:2

Dinamikusan létrehozott vezérlők A futási időben létrehozott vezérlőket ugyanúgy kezeljük, mint a konstrukció során létrehozott vezérlőket Egyszerre több, ugyanolyan típusú vezérlőt is létrehozhatunk ezeket célszerű egy adatszerkezetbe szervezni, és közös eseménykezelőt rendelni hozzájuk az eseménykezelőben meghatározhatjuk, melyik vezérlő küldte az eseményt a sender() (vagy QObject::sender()) művelet visszaadja az esemény küldőjét QObject mutatóként ezt konvertálhatjuk megadott altípusra a qobject_cast<t> utasítással ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:3

Dinamikusan létrehozott vezérlők Pl.: QVector<QPushButton*> buttons; // gombokat tartalmazó vektor for ( ) // gombok létrehozása egy ciklusban { QPushButton* button = new QPushButton(this); buttons.append(button); // új gomb hozzá vétele connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked())); // eseménykezelés megvalósítása közös // eseménykezelővel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:4

Dinamikusan létrehozott vezérlők Pl.: void buttonclicked() // eseménykezelő { QPushButton* senderbutton = qobject_cast<qpushbutton*>(sender()); // lekérjük az esemény küldőjét gombként senderbutton->settext("you clicked me!"); // a külsőt módosítjuk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:5

Dinamikusan létrehozott vezérlők kezelése A dinamikus létrehozást akkor célszerű használni, ha: a felületen sok ugyanolyan típusú, hasonló tulajdonságú vezérlőt kell létrehozni a felületen lévő vezérlők száma változhat A dinamikusan létrehozott vezérlőket célszerű elhelyezések segítségével pozícionálni és/vagy méretezni Ha változhat a vezérlők száma, a régieket törölni kell (delete), amikor levesszük őket a felületről ekkor a hozzá kötött eseménykezelő társítások megszűnnek (a disconnect hívódik meg a háttérben) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:6

Feladat: Készítsünk egy alkalmazást, amelyben száz gombot jelenítünk meg egy 10 10-es rácsban sorszámozva. Gombra kattintással a sorszám megjelenik egy központi kijelzőn, míg a gombon egy X felirat. Az ilyen feliratú gombokra kattintva már nem történik semmi. a felületen felveszünk egy LCD kijelzőt, valamint a gombokat rács elrendezésben, a gombok feliratának (text) beállítjuk a sorszámot a gombokat közös eseménykezelőhöz (setnumber()) rendeljük, amely a küldő gomb (sender()) sorszámát beírja az LCD kijelzőre (amennyiben nem X feliratú), a gomb feliratát pedig lecseréli X -re ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:7

Tervezés: QWidget NumberGridWidget - _lcdnumber :QLCDNumber* - _gridlayout :QGridLayout* - _vboxlayout :QVBoxLayout* + NumberGridWidget(QWidget*) + ~NumberGridWidget() «slot» - setnumber() :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:8

Megvalósítás (numbergridwidget.cpp): NumberGridWidget::NumberGridWidget(QWidget *parent) : QWidget(parent) { for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j){ QPushButton* button = new QPushButton( QString::number(i * 10 + j + 1), this); // gomb létrehozása _gridlayout->addwidget(button, i, j); // gomb felvétele az elrendezésre connect(button, SIGNAL(clicked()), this, SLOT(setNumber())); // eseménykezelő kapcsolat ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:9

Megvalósítás (numbergridwidget.cpp): void NumberGridWidget::setNumber() { QObject* senderobject = sender(); // küldő objektum lekérdezése QPushButton* senderbutton = qobject_cast<qpushbutton*>(senderobject); // a küldő típusát konvertálnunk kell if (senderbutton->text()!= "X") _lcdnumber->display(senderbutton->text()); senderbutton->settext("x"); // a gombra beállítunk egy X feliratot ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:10

Feladat: Módosítsuk az előző feladatot úgy, hogy futás közben át lehessen méretezni a gombrácsot. Kezdetben a rács üres, egy külön gombbal lehet egy előugró ablakot előhozni, amelyben beállíthatjuk az új méretét, és ennek hatására a rács újraméreteződik, és alaphelyzetbe áll. minden átméretezésnél (resizegrid()) töröljük a régi gombokat, és megfelelő mennyiségű új gombot generálunk a méret beállító ablak egy új osztály (GridSizeDialog), amely a QDialog leszármazottja, így felhasználhatjuk az accept() és reject() eseménykezelőjét, megjeleníteni pedig az exec() metódussal fogjuk (így blokkolja a háttérben lévő ablakot) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:11

Tervezés: NumberGridWidget QWidget - _gridsizedialog :GridSizeDialog* - _lcdnumber :QLCDNumber* - _sizebutton :QPushButton* - _gridlayout :QGridLayout* - _vboxlayout :QVBoxLayout* - _buttongrid :QVector<QPushButton*> + NumberGridWidget(QWidget*) + ~NumberGridWidget() «slot» - setnumber() :void - resizegrid() :void -_gridsizedialog GridSizeDialog QDialog - _label :QLabel* - _spinbox :QSpinBox* - _okbutton :QPushButton* - _cancelbutton :QPushButton* + GridSizeDialog(QWidget*) + gridsize() :int ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:12

Megvalósítás (numbergridwidget.cpp): NumberGridWidget::NumberGridWidget(QWidget *parent) : QWidget(parent) { _gridsizedialog = new GridSizeDialog(); connect(_sizebutton, SIGNAL(clicked()), _gridsizedialog, SLOT(exec())); // méretező ablak megjelenítése gombnyomásra connect(_gridsizedialog, SIGNAL(accepted()), this, SLOT(resizeGrid())); // átméretezés a dialógus elfogadására ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:13

Megvalósítás (numbergridwidget.cpp): void NumberGridWidget::resizeGrid() { foreach(qpushbutton* button, buttongrid) { // korábbi gombok _gridlayout->removewidget(button); // levétel az elrendezésről delete button; // vezérlő törlése _buttongrid.clear(); // mutatók törlése for (int i = 0; i < gridsizedialog->gridsize(); ++i) { ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:14

Stílusok A vezérlőket különböző stílusokkal láthatjuk el, amelyek szabályozzák annak megjelenését a stylesheet tulajdonság segítségével A stílusok kezelése szintaktikailag hasonló a CSS leíráshoz megadása szöveges formában történik az objektum, a típus és a beállítás megadásával, pl.: QPushButton { color: red; background-color: white // a gomb fehér háttéren piros betűs lesz QCheckBox:hover:checked { color: white // amennyiben ki van választva a // kijelölő doboz, és az egér rajta van, // akkor fehér színű lesz a szöveg ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:15

Stílusok QLineEdit { background-image: url(:/images/bck.png); border-width: 1px; border-style: solid; border-radius: 4px; // a hátteret kép tölti ki, keret megformázva a szabályozása történhet az egész alkalmazás, illetve bármely vezérlő szintjén, pl.: QApplication::setStyleSheet(" QPushButton { color:black QPushButton:enabled { color:red "); // minden engedélyezett gomb piros feliratú, // minden nem engedélyezett gomb fekete // feliratú lesz a programban ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:16

Időzítés Sokszor nem a felhasználó által vezérelten, hanem rögzítet módon, adott időközönként szeretnénk lefuttatni egy tevékenységet, erre szolgál az időzítő (QTimer) a start(<intervallum>) eseménykezelő indítja az időzítőt (az intervallumot ezred másodpercben adjuk meg), a stop() leállítja az idő leteltekor kiváltja a timeout eseményt, majd újra elindítja a visszaszámlálást lehetőség van egyszeri kiváltásra is (singleshot( )) lekérdezhető az állapota (active, singleshot) egyszerre tetszőleges sok időzítőt használhatunk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:17

Időzítés Pl.: _timer = new QTimer(); // időzítő connect(_timer, SIGNAL(timeout()), this, SLOT(updateTime())); _timer->start(1000); // időzítő indítása void updatetime() // eseménykezelő { _time--; _textbox->settext(qstring::number(_time)); // 1 másodpercenként frissül a szöveg ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:18

Feladat: Készítsünk egy alkalmazást, amelyben véletlenszerűen változtatjuk egy gomb színét másodpercenként. Egy külön gombbal ki/be kapcsolhatjuk az animációt. a felületen (ChangingColorsWidget) két gombot helyezünk el, az egyikkel indítjuk/állítjuk le az időzítőt az időzítő (timer) egy eseménykezelőt futtat (timeout), amelyben a gomb stílusát változtatjuk ehhez véletlen számokat generálunk a qsrand(<kezdőérték>) és qrand() függvények segítségével, amit időfüggő értékkel indítunk (QTime::currentTime().msec()) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:19

Tervezés: QWidget ChangingColorWidget - _colorbutton :QPushButton* - _startstopbutton :QPushButton* - _timer :QTimer* + ChangingColorWidget(QWidget*) + ~ChangingColorWidget() «slot» - modifycolor() :void - timeout() :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:20

Megvalósítás (changingcolorwidget.cpp): void ChangingColorWidget::modifyColor() { if (!_timer->isactive()) { // ha az időzítő nem fut _startstopbutton->settext(tr("stop")); _timer->start(1000); // elindítjuk else { // ha fut _startstopbutton->settext(tr("start")); _timer->stop(); // leállítjuk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:21

Megvalósítás (changingcolorwidget.cpp): void ChangingColorWidget::timeout() { // időzített eseménykezelő // stílus beállítása véletlen számok // segítségével: _colorbutton->setstylesheet("qpushbutton { background-color: rgb(" + QString::number(qrand() % 256) + "," + QString::number(qrand() % 256) + "," + QString::number(qrand() % 256) + ") "); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:22

Feladat: Az előző feladat alapján készítsünk egy gombrácsot, amelyben kattintás hatására indul a színváltó animáció, de nem csak az adott gombon, hanem egy kereszt alakban (a teljes sorban és oszlopban). A rács méretét külön ablakban állíthatjuk be. minden egyes kattintásra egy új időzítőt indítunk el, így tetszőlegesen sok időzítő lehet a programban az időzítőket és a gombokat a koordináták (sor, oszlop index) alapján tudjuk összekapcsolni, ezért létrehozunk egy koordináta segédtípust (Coordinate) az időzítőket egy asszociatív tömb (QMap) segítségével tároljuk el a hozzátartozó koordinátával egyetemben ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:23

a gombok esetén is el kell tárolnunk a koordinátát, ezért létrehozunk egy speciális gombtípust (GridPushButton), amely tárolja a koordinátát is az időzítőkhöz közös eseménykezelőt kapcsolunk (changecolors), amelyben beazonosítjuk a küldő időzítőt (sender()), visszakeressük a hozzátartozó koordinátát, majd ez alapján átszínezzük a megfelelő gombokat egy külön ablak segítségével végezzük az átméretezést (GridSizeDialog), de ügyelnünk kell arra, hogy minden létező időzítőt leállítsunk, és kitöröljünk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:24

Tervezés: ChangingColorWidget QWidget - _gridsizedialog :GridSizeDialog* - _buttongrid :QVector<GridPushButton*> - _timers :QMap<QTimer*, Coordinate> - _sizebutton :QPushButton* - _gridlayout :QGridLayout* - _vboxlayout :QVBoxLayout* + ChangingColorWidget(QWidget*) + ~ChangingColorWidget() + startcolorchange() :void + resizegrid() :void + changecolors() :void -_gridsizedialog QDialog GridSizeDialog -_timers «struct» Coordinate - _x :int - _y :int + Coordinate() + Coordinate(int, int) + x() :int + y() :int QPushButton GridPushButton # _coordinate :Coordinate * #_coordinate + GridPushButton(Coordinate, QWidget*) + coordinate() :Coordinate {query ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:25

Megvalósítás (changingcolorwidget.cpp): void ChangingColorWidget::startColorChange() { // szükségünk van a küldő gomb koordinátájára GridPushButton *button = qobject_cast<gridpushbutton*>(sender()); Coordinate coordinate = button->coordinate(); // létrehozunk egy új időzítőt, amit azonnal el // is indítunk QTimer* timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(changeColors())); timer->start(1000); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:26

Megvalósítás (changingcolorwidget.cpp): // és elmentünk a megadott koordinátával _timers.insert(timer, coordinate); void ChangingColorWidget::changeColors() { // megkeressük, melyik koordinátán kell // módosítani a színeket Coordinate coordinate = timers[qobject_cast<qtimer*>(sender())]; ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:27

Megvalósítás (changingcolorwidget.cpp): // megkeressük az átszínezendő gombokat foreach(gridpushbutton* button, _buttongrid) { if (button->coordinate().x() == coordinate.x() ) { // az adott sorban és oszlopban button->setstylesheet(stylesheet); // lecseréljük az összes gomb // megjelenését ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:28

Képek kezelése Nem csak színeket, képeket is elhelyezhetünk a felületen vagy a stílusban, vagy külön betöltve az alkalmazásban A Qt támogatja a legtöbb megszokott képformátumot (BMP, GIF, JPEG, PNG, ), a lista tovább bővíthető A képeket objektumként is kezeljük, erre több típus szolgál: QImage: elsősorban I/O műveletekre és pixel szintű manipulációra optimalizál QPixmap: elsősorban a képek felületi megjelenítésére szolgál QBitmap: monokróm képek kezelésére QPicture: képre történő rajzolást biztosít ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:29

Képek megjelenítése A képeket a felületre több vezérlő segítségével is felhelyezhetünk, vagy rajzolhatjuk alapvetően a címke (QLabel) szolgál a képmegjelenítésre a pixmap tulajdonságon keresztül, mely egy QPixmap objektumot tud fogadni, pl.: QPixmap* pic = new QPixmap("img.bmp"); label->setpixmap(*pic); // kép beállítása a kép a címkén eredeti méretben jelenik meg, ha a címke mérete rögzített, akkor a képet megvágja a képet lekicsinyíthetjük a scale(<szélesség>, <magasság>, ) művelettel, pl.: label->setpixmap(pic->scale(50,50)); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:30

Feladat: Készítsünk egy mozgókép megjelenítő alkalmazást, amelyben képek sorozatát tudjuk betölteni (mint filmkockákat), és megjeleníteni azt animációként. Lehessen szabályozni az animáció sebességét, valamint lehessen látni, hogy a következő 1 másodpercben milyen képkockák jelennek meg. a felületnek lesz statikus (betöltő gomb, indító/leállító gomb, megjelenítő címke, sebességállító), valamint dinamikus része (egy másodpercnek megfelelő képek), előbbit a felülettervezővel készítjük eltároljuk a betöltött képeket (images), valamint a generált címkéket (smallimagelabels), és időzítő segítségével fogjuk periodikusán cserélni őket ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:31

Tervezés: MotionPictureWidget QWidget - _ui :Ui::MotionPictureWidget* - _smallimagelabels :QVector<QLabel*> - _images :QVector<QPixmap*> - _timer :QTimer* - _currentimage :int + MotionPictureWidget(QWidget*) + ~MotionPictureWidget() + loadimages() :void + startstopmotion() :void + changespeed(int) :void + changeimages() :void - reloadimages() :void - reloadlabels() :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:32

Megvalósítás (motionpicturewidget.cpp): void MotionPictureWidget::loadImages(){ foreach(qfileinfo fileinfo, fileinfos){ QPixmap* image = new QPixmap( fileinfo.absolutefilepath()); // képek betöltése if (!image->isnull()) // amennyiben képfájl _images.append(image); // felvesszük a képek közé else delete image; // különben töröljük ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:33

Megvalósítás (changingcolorswidget.cpp): void MotionPictureWidget::reloadImages(){ if (images.size() > 0) { // amennyiben van kép _ui->mainimagelabel->setpixmap( _images[_currentimage]->scaled(298, 298)); // nagy kép beállítása for (int i = 0; i < _smallimagelabels.size(); i++) _smallimagelabels[i]->setpixmap( _images[(_currentimage + i + 1) % _images.size()]->scaled(18,18)); // kis képek beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 3:34