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

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 6. előadás. Összetett alkalmazások megvalósítása. Giachetta Roberto

Összetett alkalmazások

Szoftvertechnológia 7. előadás. Objektumorientált tervezés: végrehajtás. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Szoftvertechnológia 6. előadás. Objektumorientált tervezés: állapotkezelés. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Programozási technológia II 3. előadás. Objektumorientált tervezés Giachetta Roberto

2. Beadandó feladat dokumentáció

2. Beadandó feladat dokumentáció

Szoftvertechnológia 5. előadás. Objektumorientált tervezés: architektúra. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

Programozási technológia 2.

3. Beadandó feladat dokumentáció

3. Beadandó feladat dokumentáció

Elemi alkalmazások fejlesztése III.

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

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

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

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

Elemi alkalmazások fejlesztése III.

1. Beadandó feladat dokumentáció

ContractTray program Leírás

DebitTray program Leírás

3. Beadandó feladat dokumentáció

ClicXoft programtálca Leírás

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

Elemi alkalmazások fejlesztése III.

HVK Adminisztrátori használati útmutató

ServiceTray program Leírás

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

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

Thermo1 Graph. Felhasználói segédlet

Programozási technológia

Szoftvertechnológia 8. előadás. Szoftverrendszerek tervezése Giachetta Roberto

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

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

Eseményvezérelt alkalmazások fejlesztése II 5. előadás. Windows Forms alkalmazások párhuzamosítása. Giachetta Roberto

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

Models are not right or wrong; they are more or less useful.

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

9. óra operációs rendszerek. Grafikus operációs rendszer

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

A Windows az összetartozó adatokat (fájlokat) mappákban (könyvtárakban) tárolja. A mappák egymásba ágyazottak.

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

Image Processor BarCode Service. Felhasználói és üzemeltetői kézikönyv

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

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, Quantum GIS program alkalmazásával Útmutató 2010.

Elemi alkalmazások fejlesztése III.

CitiDirect BE SM Felhasználói útmutató

Windows mappaműveletek

VARIO Face 2.0 Felhasználói kézikönyv

A CCL program használatbavétele

ELTE, Informatikai Kar december 12.

Felhasználói segédlet a PubMed adatbázis használatához. Publikációk keresése, letöltése valamint importja

Szoftvertechnológia 8. előadás. Szoftverrendszerek tervezése. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

TERC V.I.P. hardverkulcs regisztráció

Programozási technológia

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

Operációs rendszerek. Tanmenet

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

A Java nyelv. Dialógus ablakok. Elek Tibor

A jobboldalon a pnlright egy Stacked Widget Állítsuk be az első lapot és nevezzük el pnldraw-ra:

Számítógépes alapismeretek 2.

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

Netlock Kft. által kibocsátott elektronikus aláírás telepítése Windows XP SP3 Internet Explorer 8 böngészőbe

2. Beadandó feladat dokumentáció

Felhasználói segédlet a Scopus adatbázis használatához

WIFI elérés beállítása Windows XP tanúsítvánnyal

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

A TERC VIP költségvetés-készítő program telepítése, Interneten keresztül, manuálisan

Az importálás folyamata Felhasználói dokumentáció verzió 2.1.

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

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

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

Elemi alkalmazások fejlesztése III

Outlook Express használata

Mobil Partner telepítési és használati útmutató

Ablak és ablakműveletek

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

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

Az operációs rendszer fogalma

Az alapértelmezett felhasználói név az "abc", a jelszó pedig "123". Ez célszerű megváltoztatni a felhasználónevet és a jelszót az első használat.

Projektmenedzsment tréning

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

A ChipScope logikai analizátor

Win-Tax évi ös verzió

13. Tárgymutató. Windows XP alapokon

É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

A Canvas LMS új és régi felülete közti különbségek

Mio Technology Limited C510, C710. Gyors használati utasítás a Mio Map v3 programhoz. Magyar

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

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Belépés a GroupWise levelező rendszerbe az Internet felől

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

SMS küldő központ Leírás

Felhasználói segédlet a Web of Knowledge / Web of Science adatbázis használatához

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

Webes alkalmazások fejlesztése 1. előadás. Webes alkalmazások és biztonságuk

A CAPICOM ActiveX komponens telepítésének és használatának leírása Windows 7 operációs rendszer és Internet Explorer 9 verziójú böngésző esetén

BaBér. Bérügyviteli rendszer. Telepítési segédlet 2014.

Átírás:

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

Ablakok A grafikus felületű alkalmazásokban a vezérlőket ablakokra helyezzük ablaknak minősül bármely vezérlő, amely egy QWidget, vagy bármely leszármazottjának példánya, és nincs szülője adottak speciális ablaktípusok is, pl.: üzenőablak (QMessageBox), elsősorban üzenetek közlésére, vagy kérdések feltételére dialógusablak (QDialog), amelynek eredménye van, elfogadható (accept), vagy elutasítható (reject) főablak (QMainWindow), amely számos kiegészítést biztosít összetett ablakok megvalósítására ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:2

Főablakok A főablak (QMainWindow) egy olyan speciális ablaktípus, amely megkönnyíti összetett, speciális vezérlőket tartalmazó ablakok létrehozását, úgymint menüsor (Menu Bar): menüpontok gyűjteménye az ablak tetején státuszsor (Status Bar): állapotkijelző sor az ablak alján eszköztár (Toolbar): ikongyűjteményeket tartalmazó funkciógombok, amely az ablak bármely szélére elhelyezhetőek Az ablakon belül további vezérlőket helyezhetünk el, amelyeket dokkolhatunk az ablak széléhez, vagy középre ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:3

Főablakok menüsor eszköztárak dokkolt vezérlők központi vezérlő státuszsor ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:4

Akciók A különböző vezérlők sokszor ugyanazon funkciókat biztosítják más formában (ikon, szöveg, ) A funkciókat egységesen akcióként (QAction) kezelhetjük, amely rendelkezik felirattal (text), ikonnal (icon), gyorsbillentyűvel (shortcut), segédüzenettel (statustip) lehetőséget ad kijelölésre (checked), valamint billentyűs gyorsnavigálásra (az & karakterrel) kiváltható billentyűzettel vagy egérrel, a kiváltást esemény (triggered) felhelyezhető tetszőleges menüre, illetve eszköztárra ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:5

Akciók pl.: QAction newact = new QAction(QIcon("new.png"), tr("ú&j"), this); // ikon és név megadása, a j billentyűre // gyorsnavigál a menüben newact->setshortcuts(qkeysequence::new); // a keretrendszer által kirendelt "új" // billentyűkombináció newact->setstatustip(tr("új fájl létrehozása")); connect(newact, SIGNAL(triggered()), this, SLOT(newFile())); // eseménykezelő társítás filemenu->addaction(newact); // felhelyezés filetoolbar->addaction(newact); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:6

Menü A menüt (QMenu) a főablak menubar tulajdonságán keresztül kezelhetjük, a menühöz felvehetünk almenüket, akciókat és elválasztókat (separator) a menük tetszőlegesen egymásba ágyazhatóak pl.: QMenu filemenu = this->menubar() ->addmenu(tr("&fájl")); // új almenü létrehozása filemenu->addaction(newact); // menüpont felvétele filemenu->addspearator(); // elválasztó filemenu->addmenu(tr("&legutóbbi fájlok")); // beágyazott almenü ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:7

Eszköztár Eszköztárakból (QToolBar) tetszőlegesen sokat vehetünk fel, amelyek alapértelmezetten az ablak tetején jelennek meg ikonok sorozatát adják, esetleges elválasztókkal szeparálva az eszköztárak alapértelmezés szerint utólag áthelyezhetőek bármely szélére az ablaknak, illetve lehet lebegő (floating) állapotban is pl.: QToolBar filebar = this->addtoolbar(tr("fájl")); // új eszköztár felvétele filebar->addaction(newact); // új akció felvétele filebar->addspearator(); // elválasztó ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:8

Státuszsor és tartalom A státuszsor (QStatusBar) alapvetően státuszüzenetek kiírására szolgál, ugyanakkor bármilyen vezérlő ráhelyezhető üzenetet kiírni a showmessage(<üzenet>) utasítással tudunk, törölni a clearmessage() utasítással pl.: this->statusbar()->showmessage(tr("kész")); Az ablak területére célszerű egy külön vezérlőben elhelyezni a tartalmat, ez a központi vezérlő (centralwidget) Amennyiben több tartalmat helyeznénk az ablakra, lehetőségünk van azokat dokkolni a QDockWidget osztály segítségével, amelyet az adddockwidget(<vezérlő>) művelettel helyezhetünk az ablakra ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:9

Alkalmazásszintű tulajdonságok A Qt alkalmazásokat minden esetben egy alkalmazás (QApplication) objektum vezérli, amely számos értéket tárol, úgymint: alkalmazás információk (applicationname, orgnizationname, applicationversion) környezeti információk (applicationdirpath, arguments, keyboardmodifiers, clipboard) grafikus környezeti adatok (allwindows, windowicon, palette, stylesheet, font) Az alkalmazás értékeihez bárhonnan, statikus műveletekkel hozzáférhetünk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:10

Alkalmazásszintű tulajdonságok Pl.: QApplication::setOrganizationName("MySoft"); QApplication::setApplicationName("MyApp"); // beállítunk némi információt QString executablename = QApplication::arguments()[0]; // lekérjük a programnevet if (QApplication::arguments().size() > 1) { // ha még van ezen felül argumentum QString arg1 = QApplication::arguments()[1]; } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:11

Beállítások kezelése Nagyobb alkalmazások rendszerint rendelkeznek külön alkalmazásszintű beállításokkal, amelyek célszerű elmentenünk, és újabb futtatáskor betöltenünk A beállítások eltárolhatóak egyedileg, de használhatjuk a beépített QSettings osztályt, amely egyszerűsíti a beállítások kezelését a beállítások eltárolásának módja platformonként változik (Linux esetén konfigurációs fájlok, Windows esetén regisztrációs adatbázis), ezt az osztály elfedi, így a programozónak a tárolás módjával nem kell törődnie a beállítások egy adott alkalmazásra és felhasználóra vonatkoznak ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:12

Beállítások kezelése a beállításokba kulcs/érték párokat vehetünk fel a setvalue(<kulcs>,<érték>) utasítással, ahol a kulcs szöveges, az érték tetszőleges QVariant lehet, lekérdezni a value(<kulcs>) utasítással tudunk a contains(<kulcs>) függvény ellenőrzi a kulcs létezését A QVariant egy általános típus, amely a primitív típusokat tudja becsomagolni, így az ottani tartalom rendelkezik több konverziós művelettel, pl.: Qvariant vi(123); // létrehozás egészből int i = vi.toint(); // visszaalakítás egészre Qvariant vc = QColor(15, 20, 200); // színből QColor c = vc.value<qcolor>(); // vissza színbe ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:13

Beállítások kezelése Pl.: QString value; QSettings settings("mysoft", "MyApp"); // beállítások létrehozása (ha korábban // beállítottuk az alkalmazás információkat, // használhatunk alapértelmezett konstruktort) settings.setvalue("myvalue", value); // érték beállítása settings.value("myvalue").tostring(); // visszakérjük az értéket és szöveggé // alakítjuk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:14

Erőforrások A főablakon használt akciókat célszerű ellátni ikonokkal, amelyeket az alkalmazáshoz kell, hogy csatoljunk Az alkalmazáshoz használt ikonokat és egyéb nem kód tartalmat lehetőségünk van erőforrásként (resource) csatolni az alkalmazáshoz az erőforrások tartalma belefordul a futtatandó állományba, így nem kell külön másolni őket az erőforrásokat a projekthez tartozó.qrc fájlban nevezhetjük meg az erőforrásként megadott fájlokat a :<elérési útvonal> hivatkozással hívhatjuk be, pl.: QIcon(":/images/new.png"); // erőforrás elérése ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:15

Feladat: Készítsünk egy Memory kártyajátékot, amelyben két játékos küzd egymás ellen. A játékmezőn kártyapárok találhatóak, és a játékosok feladata ezek megtalálása. a játék különböző kártyacsomagokkal játszható, amelyek könyvtárakból tölthetőek be, minden ilyen könyvtárban található egy name.txt, ami a csomag nevét tartalmazza, és tetszőleges számú kép (ezek a kártyák), valamint egy hátlap (back fájlnévvel) lehetőségünk van egy beállító ablakban megadni a kiválasztott kártyacsomagot, valamint a játéktábla méretét (csak páros méretű, de legalább 4 kártyából álló lehet), valamint a játékosok neveit ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:16

kezdetben minden kártya le van fordítva, a játékosok felváltva lépnek, minden lépésben felfordíthatnak két kártyát amennyiben a kártyák egyeznek, úgy felfordítva maradnak és a játékos ismét léphet, különben 1 másodperc múlva visszafordulnak, és a másik játékos következik a játékot az nyeri, aki több kártyapárt talált meg megnyert játékok számát göngyölítve jelenítjük meg, amíg új játékosokat nem állítunk be a felületen folyamatosan megjelenítjük a játékosok adatait (sikeres, sikertelen lépések száma, megnyert játszmák száma) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:17

Felhasználói esetek: Első kártya felfordítása Lépés «include» «precedes» Új játék «include» «precedes» Második kártya felfordítása Nevek megadása «precedes» Beállítások «include» Felhasználó «include» Táblaméret megadása «include» Kilépés Kártyacsomag megadása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:18

Tervezés (architektúra): a játékot kétrétegű architektúrában valósítjuk meg a modell tartalmazza: magát a játékot, amit egy kezelőosztály felügyel (GameManager), valamint hozzá segédosztályként a játékost (Player) a kártyacsomagokat (CardPack) a nézet tartalmazza: a játék főablakát (MainWindow), amely tartalmaz egy menüt és egy státuszsort a beállítások segédablakát (ConfigurationDialog) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:19

a játékfelületet megjelenítő vezérlőt (GameWidget), amely tartalmazza a játékmezővel kapcsolatos tevékenységeket ehhez segédosztályként a felhasználói információkat kiíró vezérlőt (PlayerStatusWidget, ezt előléptetett vezérlővel állítjuk be a felülettervezőben), valamint a képet megjeleníteni tudó egyedi gombot (ImageButton) a nézet a modell publikus műveleteit hívja, és eseményeket is kaphat tőle egy csomag kártyát erőforrásként csatolunk az alkalmazáshoz (packs.qrc), hogy mindig legyen legalább egy csomag kártya ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:20

Tervezés (architektúra): ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:21

Tervezés (modell): CardPack - _name :QString - _faces :QVector<QPixmap> - _back :QPixmap + CardPack(QString&) + getname() :QString {query} + cardcount() :int {query} + getfaces() :QVector<QPixmap> {query} + getback() :QPixmap& {query} + getface(int) :QPixmap& {query} -_cardpacks 1..* GameManager - _cardpacks :QVector<CardPack*> - _players :QVector<Player*> - _currentnumcols :int - _currentnumrows :int - _currentcardpackindex :int - _currentplayerindex :int - _timer :QTimer* - _cardfound :QVector<bool> - _foundcards :int - _cardids :QVector<int> - _firstcardindex :int - _secondcardindex :int QObject Player - _name :QString - _hits :int - _misses :int - _victories :int + Player(QString) + newgame() :void + addhit() :void + addmiss() :void + addvictory() :void + getname() :QString {query} + gethits() :int {query} + getmisses() :int {query} + getvictories() :int {query} -_players 2 + allcardpacks() :QVector<CardPack*> {query} + currentpack() :CardPack* {query} + currentplayer() :Player* {query} + firstplayer() :Player* {query} + GameManager() + ~GameManager() - loadpacks(qstring) :void + secondplayer() :Player* {query} - shufflecards() :void «signal» + cardchanged(int, QPixmap&) :void + gameover(qstring) :void + statuschanged(qstring) :void «slot» - hidecards() :void + newgame(int, int) :void + selectcard(int) :void + setcurrentpack(cardpack*) :void + setplayers(qstring, QString) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:22

Tervezés (nézet): -configurationdialog ConfigurationDialog - _ui :Ui::ConfigurationDialog* - _cardpacks :QVector<CardPack*> - _cardlabels :QVector<QLabel*> QDialog + ConfigurationDialog(QVector<CardPack*>, QWidget*) + ~ConfigurationDialog() + firstplayername() :QString + secondplayername() :QString + numberofrows() :int + numberofcolumns() :int + selectedcardpack() :CardPack* - loadsettings() :void - savesettings() :void «slot» + setfirstplayername(qstring) :void + setsecondplayername(qstring) :void + setnumberofrows(int) :void + setnumberofcolumns(int) :void + checkvalues() :void + changecardpack(int) :void + setmaxrows() :void + setmaxcols() :void GameWidget - _ui :Ui::GameWidget* - _manager :GameManager* - _buttons :QVector<ImageButton*> - _isconfigured :bool - _configurationdialog :ConfigurationDialog* QWidget + GameWidget(QWidget*) + ~GameWidget() + gamemanager_cardchanged(int, QPixmap&) :void + gamemanager_gameover(qstring) :void «signal» + statuschanged(qstring) :void «slot» + newgame() :void + configuregame() :void + buttonclicked() :void -buttons 4..* - _image :QPixmap QPushButton ImageButton + ImageButton(QWidget*) + pixmap() :QPixmap {query} # paintevent(qpaintevent*) :void «slot» + setpixmap(qpixmap&) :void + clearpixmap() :void 2 -gamewidget QWidget PlayerStatusWidget - _ui :Ui::PlayerStatusWidget* - _player :Player* + PlayerStatusWidget(QWidget*) + ~PlayerStatusWidget() «slot» + setplayer(player*) :void + refreshplayer() :void QMainWindow MainWindow - _newgameaction :QAction* - _exitaction :QAction* - _configureaction :QAction* - _gamemenu :QMenu* - _gamewidget :GameWidget* + MainWindow(QWidget*) + ~MainWindow() # closeevent(qcloseevent*) :void ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:23

Tervezés (dinamikus): új játék indításához először a főablakban (MainWindow) kell kiváltanunk (triggered) a megfelelő akciót (newgameaction) ennek hatására a főablak új játékot indít (newgame) a játék nézetében (GameWidget) a nézet beállítja a játék paramétereit (configuregame) a nézet létrehozza az új játékot (newgame) a modellben (GameManager) a modell megkeveri a kártyákat (shufflecards), majd eseménnyel jelzi az állapot változását (changestatus) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:24

Tervezés (dinamikus): MainWindow GameWidget GameManager user newgameaction.triggered() newgame() configuregame() newgame(rows, cols) changestatus(message) shufflecards() changestatus(message) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:25

Tervezés (dinamikus): amennyiben új játékot kezdünk (newgame), a felület aktív lesz, játék végén (gameover) pedig inaktívvá válik a játék modellje kezdetben egy kártyát sem mutat, de új játék kezdésekor (newgame) az összes kártyát megmutatja, majd automatikusan elrejti őket (hidecards) kiválasztás (selectcard) hatására előbb egyet, majd kettőt megmutathat (cardchanged) amennyiben a két kártya egyezik, és minden kártyát felfedtünk, vége a játéknak (gameover) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:26

Tervezés (dinamikus): all cards revealed gameover() [cards match] two cards revealed selectcard(int) /cardchanged(int, QPixmap&) hidecards() newgame(int, int) hidecards() /cardchanged(int, QPixmap&) all cards hidden some cards hidden one card revealed selectcard(int) /cardchanged(int, QPixmap&) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:27

Tervezés (dinamikus): buttonclick() /model.selectcard(int) clickable newgame() /model.newgame() model.gameover() /statuschanged() not clickable ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:28

Megvalósítás (mainwindow.cpp): MainWindow::MainWindow(){ connect(newgameaction, SIGNAL(triggered()), gamewidget, SLOT(newGame())); connect(configureaction, SIGNAL(triggered()), gamewidget, SLOT(configureGame())); connect(gamewidget, SIGNAL(statusChanged( QString)), this->statusbar(), SLOT(showMessage(QString))); // állapotváltás a játékban } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:29

Megvalósítás (gamewidget.cpp): GameWidget::GameWidget(QWidget *parent) : { connect(manager, SIGNAL(statusChanged(QString)), this, SIGNAL(statusChanged(QString))); // a logikai réteg eseménye egy újabb // eseményt vált ki connect(manager, SIGNAL(statusChanged(QString)), ui->firstplayerstatus, SLOT(refreshPlayer())); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:30

Megvalósítás (gamemanager.cpp): void GameManager::newGame(int numrows, int numcols){ statuschanged(trutf8("új játék elindítva, ") + players[currentplayerindex]->getname() + trutf8(" következik.")); // esemény kiváltása } } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 7:31