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

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Összetett grafikus felületű alkalmazások. 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

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

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

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

2. Beadandó feladat dokumentáció

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

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

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

Elemi alkalmazások fejlesztése III.

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

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

Elemi alkalmazások fejlesztése III.

Programozási technológia

Szoftvertechnológia 8. előadás. Szoftverrendszerek tervezése 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.

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

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

ContractTray program Leírás

1. Beadandó feladat dokumentáció

DebitTray program Leírás

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

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

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

A Java nyelv. Dialógus ablakok. Elek Tibor

Java Programozás 11. Ea: MVC modell

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

ServiceTray program Leírás

Elemi alkalmazások fejlesztése III

3. Beadandó feladat dokumentáció

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

Elemi alkalmazások fejlesztése III.

SDI ALKALMAZÁS I. Workspace / ResourceView / Toolbar / IDR_MAINFRAME. Workspace / ResourceView / Menu / IDR_MAINFRAME

ClicXoft programtálca Leírás

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

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

Operációs rendszerek. Tanmenet

2. Beadandó feladat dokumentáció

HVK Adminisztrátori használati útmutató

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET Core) Cserép Máté

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

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

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

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

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

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

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

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

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

A CCL program használatbavétele

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

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

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

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

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

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

Windows mappaműveletek

Thermo1 Graph. Felhasználói segédlet

A d m i n i s z t r á c i ó s f e l a d a t o k a I n t e g r á l t K ö n y v t á r i R e n d s z e r b e n

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

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

Elemi alkalmazások fejlesztése III.

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

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

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

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

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

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

Operációs rendszerek gyak.

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

Eseményvezérelt alkalmazások fejlesztése I 12. előadás. Összetett szoftver architektúrák. Giachetta Roberto

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

Webes alkalmazások fejlesztése 7. előadás. Autentikáció és autorizáció (ASP.NET)

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 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Állomány (fájl) = összetartozó adathalmaz, program, melyet a számítógép egyetlen egységként kezel.

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

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

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

Felhasználói kézikönyv - Android kliens

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

ELTE, Informatikai Kar december 12.

Az ErdaGIS térinformatikai keretrendszer

VarioFace dokumenta cio

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

Algoritmus terv 3. Fejezet: Folyamatok meghatározása

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

Win-Tax évi ös verzió

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

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

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése I 6. előadás Összetett alkalmazások megvalósítása Giachetta Roberto A jegyzet az ELTE Informatikai Karának 2014. évi Jegyzetpályázatának támogatásával készült

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 6: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 6: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 6: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 6: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 6: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 6: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 6: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 6:9

Egyedi tulajdonságok A tulajdonságok célja egyszerűsített hozzáférés adott mezőértékekhez, lekérdező és beállító műveletek segítségével lehetőségünk van saját tulajdonságok létrehozására a Q_PROPERTY makró segítségével, megadjuk típusát és nevét, valamint az író (WRITE) és olvasó (READ) műveleteket Pl.: class MyObject : public QObject { Q_OBJECT Q_PROPERTY(int prop READ prop WRITE setprop) int prop(); // olvasó művelet void setprop(int value); // író művelet ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 6:10

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 6:11

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 6:12

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 6:13

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 6:14

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 6:15

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 6:16

Példa 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 6:17

Példa 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 6:18

Példa Felhasználói esetek: uc CardGame 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 6:19

Példa 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 6:20

Példa 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 6:21

Példa Tervezés (architektúra): ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 6:22

Példa Tervezés (modell): class Model CardPack - _back :QPixmap - _faces :QVector<QPixmap> - _name :QString + cardcount() :int {query} + CardPack(QString&) + getback() :QPixmap& {query} + getface(int) :QPixmap& {query} + getfaces() :QVector<QPixmap> {query} + getname() :QString {query} -_cardpacks 1..* GameManager - _cardfound :QVector<bool> - _cardids :QVector<int> - _cardpacks :QVector<CardPack*> - _currentcardpackindex :int - _currentnumcols :int - _currentnumrows :int - _currentplayerindex :int - _firstcardindex :int - _foundcards :int - _players :QVector<Player*> - _secondcardindex :int - _timer :QTimer* QObject Player - _hits :int - _misses :int - _name :QString - _victories :int + addhit() :void + addmiss() :void + addvictory() :void + gethits() :int {query} + getmisses() :int {query} + getname() :QString {query} + getvictories() :int {query} + newgame() :void + Player(QString) -_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 6:23

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

Példa Tervezés (dinamikus): a kommunikáció a főablaknál indul (pl. newgameaction), amely tevékenységeit a játékkezelő vezérlőn át végzi (newgame), amely továbbítja a megfelelő formában a játékkezelőnek, amely végrehajtja a tevékenységet a logikai szinten (newgame(<szélesség>, <magasság>)) amennyiben a tevékenység változást eredményez, a logikai réteg esemény (pl. statuschanged(<üzenet>), gameover(<üzenet>)) segítségével jelzi a játékkezelő vezérlőnek a változtatást, amely esetlegesen továbbjelzi azt a főablaknak (újabb esemény kiváltásával) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 6:25

Példa Tervezés (dinamikus): sd CardGame MainWindow GameWidget GameManager Felhasználó newgameaction.triggered() newgame() configuregame() newgame(rows, cols) changestatus(message) shufflecards() changestatus(message) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 6:26

Példa 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 6:27

Példa 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 6:28

Példa Megvalósítás (gamemanager.h): class GameManager : public Qobject { Q_OBJECT // tulajdonságok beállítása: Q_PROPERTY(CardPack* currentpack READ currentpack WRITE setcurrentpack) Q_PROPERTY(Player* currentplayer READ currentplayer) public: explicit GameManager(); // nincs másoló konstruktor és értékadás ~GameManager(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 6:29

Példa 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 6:30

Többablakos környezet A dokumentumkezelő alkalmazásokban sokszor hasznos, ha egyszerre több dokumentumot is megnyithatunk, szerkeszthetünk Az alkalmazásokat így két csoportba soroljuk: egy dokumentumot kezelő (Single Document Interface, SDI) több dokumentumot kezelő (Multi Document Interface, MDI), ahol egy ablakon belül párhuzamosan több dokumentumot is meg tudunk jeleníteni minden dokumentum egy külön ablak a felületen belül, amelyekből mindig csak egy lehet aktív ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 6:31

Többablakos környezet A Qt-ben is lehetőségünk van többablakos alkalmazás készítésére, erre szolgál a QMdiArea vezérlő, amely definiál egy többablakos területet (egy főablak központi vezérlőjeként) az MDI terület biztosít általános (SubWindowView), valamint lap alapú (TabbedView) felépítést, ez szabályozható (viewmode) az ablakok rendezhetőek mozaikosan (tilesubwindows()) és lépcsőzetesen (cascadesubwindows()) a vezérlők felhelyezhetőek az addsubwindow(<vezérlő>) utasítással, az így felvett ablakok később lekérdezhetőek (subwindowlist), mindig van egy aktív ablak (currentsubwindow) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 6:32