Elemi alkalmazások fejlesztése III.

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

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

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

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

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

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

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

Elemi alkalmazások fejlesztése IV.

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

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

Elemi alkalmazások fejlesztése III

Programozás II gyakorlat. 4. Öröklődés

Eseménykezelés. Aszinkron kommunikáció

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

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

Elemi alkalmazások fejlesztése III.

Feladat. Tervezés és implementálás

Elemi alkalmazások fejlesztése III

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

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

Összetett alkalmazások

Hálózati alkalmazások

Budapest, március. ELTE Informatikai Kar

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

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

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Összetett grafikus 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

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

Elemi alkalmazások fejlesztése III

Elemi alkalmazások fejlesztése III

Eseménykezelés. Aszinkron kommunikáció

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

Programozás C++ -ban 2007/4

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

C#, OOP. Osztályok tervezése C#-ban

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

Programozás II. ATM példa Dr. Iványi Péter

Programozás II gyakorlat. 8. Operátor túlterhelés

Körkörös listák. fej. utolsó. utolsó. fej

Eseményvezérelt alkalmazások

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Széchenyi István Egyetem

Adatbázis-kezelés ODBC driverrel

Elemi alkalmazások fejlesztése IV. Adatbáziskezel alkalmazás készítése QtDesignerben. Készítette: Szabóné Nacsa Rozália

Programozás C++ -ban

4. Öröklődés. Programozás II

117. AA Megoldó Alfréd AA 117.

500. CC Megoldó Alfréd CC 500.

Access adatbázis elérése OLE DB-n keresztül

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

3. Osztályok II. Programozás II

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

500. DD Megoldó Alfréd DD 500.

BME MOGI Gépészeti informatika 7.

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

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

Maximum kiválasztás tömbben

Objektumorientált programozás C# nyelven III.

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

Adattípusok. Max. 2GByte

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Adattípusok. Max. 2GByte

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

OOP: Java 8.Gy: Abstract osztályok, interfészek

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

.Net adatstruktúrák. Készítette: Major Péter

Java programozási nyelv 5. rész Osztályok III.

ANDROID ALKALMAZÁSFEJLESZTÉS

Objektumorientált programozás C# nyelven

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

Adatok speciális megjelenítése

Mobil informatika gyakorlat. 2. óra: NFC a gyakorlatban

Események C#-ban Krizsán Zoltán iit

Programozási nyelvek Java

Programozás I. 5. Előadás: Függvények

Grafikus Felhasználói Felületű (GUI) program készítése a QT Creatorral, illetve a Microsoft Visual Studio-val

C++ Standard Template Library (STL)

Adatbázisok webalkalmazásokban

C# osztályok. Krizsán Zoltán

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Általános szoftver architektúrák

Kalapácsvetés 2016 szöveges

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

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

Programozás II. 2. Dr. Iványi Péter

Osztály és objektum fogalma

Képfájlok beolvasása és megjelenítése

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

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

Átírás:

Elemi alkalmazások fejlesztése III. Memóriajáték 1. Készítette: Szabóné Nacsa Rozália nacsa@inf.elte.hu people.inf.elte.hu/nacsa/qt4/eaf3/ Qt 4 2007 1

memorygame Játék közben 2

memorygame Kártyák kiválasztása 3

Az alkalmazás osztálydiagramja mod02 mod02 mod03 4

A modul tartalma Látványelemek Saját kártya vezérlő készítése (CardButton osztály) Saját kártya csoport vezérlő készítése (CardGroup osztály) Adatok Kártya csomag kezelő osztály elkészítése (CardPack osztály) Kártya csomagokat (többet!) kezelő osztály elkészítése (CardPackSet osztály) Alkalmazás Kártya csomagok megjelenítése (cardviewer, cardtree projektek) 5

Utils modul: segéd függvények utils.h utils.h, utils.cpp #include <QString> namespace Utils void initrandomgenerator(); //Véletlenszám generátor inicializálása int getnextrandomnumber(const int max); //[0..max] közé eső véletlenszám QString getapplicationdirprefix(); //Az éppen futó alkalmazás elérési útvonala ; utils.cpp #include <QDir> #include <QApplication> #include <QTime> void Utils::initRandomGenerator() QTime t = QTime::currentTime(); #include "utils.h" srand(t.hour()*12 + t.minute()*60 + t.second()*60); int Utils::getNextRandomNumber(const int max) return (int) (((float) max)*rand()/(rand_max + 0.1)); QString Utils::getApplicationDirPrefix() return qapp >applicationdirpath() + QDir::separator(); 6

CardButton: definíció cardbutton cardbutton.h cardbutton.h class CardButton : public QPushButton Q_OBJECT #include <QPushButton> #include <QPixmap> public: CardButton( QWidget * parent = 0); ~CardButton(); void setpixmap (QPixmap pixmap) mpixmap=pixmap; int getid() return mid; void setid(int id) mid = id; protected: void paintevent(qpaintevent * event); public slots: void slotclicked(); signals: void cardbuttonclicked(cardbutton*); void cardbuttonclicked(int); private: QPixmap mpixmap; int mid; ; 7

CardButton: implementáció cardbutton cardbutton.cpp cardbutton.cpp CardButton::CardButton( QWidget * parent) : QPushButton( parent ) connect(this,signal(clicked()),this,slot(slotclicked())); #include <QPainter> #include <QPaintEvent> #include "cardwidget.h" void CardButton::slotClicked() emit cardbuttonclicked(this); emit cardbuttonclicked(mid); void CardButton::paintEvent (QPaintEvent * /*event*/) int side = qmin(size().width(), size().height()); QRect rect((size().width() side) / 2, (size().height() side) / 2, side, side); QPainter painter; painter.begin(this); painter.drawpixmap(rect,mpixmap); painter.end(); 8

CardButtonGroup: definíció cardbuttongroup cardbuttongroup.h cardbuttongroup.h typedef QList<CardButton*> CardButtonList; class CardButtonGroup : public QFrame #include <QFrame> Q_OBJECT #include <QList> public: CardButtonGroup(QWidget *parent = 0); class QGridLayout; void newcardbuttongroup(int row, int col); class QPixmap; CardButton* getcardbutton(int i); class CardButton; public slots: void updatecardbuttonpixmap(int cardbuttonid, QPixmap pixmap); void setcardbuttonenabled(int cardbuttonid, bool b); signals: void cardbuttonclicked(int i); void cardbuttongroupchanged(int numrows, int numcols); private: void insertcardbuttons(int row, int col ); void removecardbuttons(); void debugcardbuttons(); private: int mnumrows; int mnumcols; CardButtonList cardbuttonlist; QGridLayout *cardbuttonlayout; ; 9

CardButtonGroup: konstruktor, newcardbuttongroup cardbuttongroup cardbuttongroup.cpp cardbuttongroup.cpp CardButtonGroup::CardButtonGroup(QWidget *parent) :QFrame(parent), mnumrows(0), mnumcols(0) cardbuttonlayout = new QGridLayout; setlayout(cardbuttonlayout); void CardButtonGroup::newCardButtonGroup(int row, int col) removecardbuttons(); insertcardbuttons(row, col ); mnumrows = row; mnumcols = col; 10

CardButtonGroup: insert, remove, update cardbuttongroup cardbuttongroup.cpp cardbuttongroup.cpp void CardButtonGroup::insertCardButtons(int row, int col ) CardButton *cardbutton; for (int i = 0; i < row; i++) for (int j = 0; j< col; j++) cardbutton = new CardButton(this); cardbutton >setsizepolicy( QSizePolicy( (QSizePolicy::Expanding),(QSizePolicy::Expanding))); cardbutton >setid(i*col+j); cardbuttonlayout >addwidget(cardbutton,i,j); //Registers cardbutton to cardbuttonlist.append(cardbutton); //Add cardbutton to container connect(cardbutton, SIGNAL(cardButtonClicked(int)), this, SIGNAL(cardButtonClicked(int))); show(); emit cardbuttongroupchanged(row,col); void CardButtonGroup::removeCardButtons( ) while (!cardbuttonlist.isempty()) delete cardbuttonlist.takefirst(); void CardButtonGroup::updateCardButtonPixmap(int cardbuttonid, QPixmap pixmap) cardbuttonlist.at(cardbuttonid) >setpixmap(pixmap); cardbuttonlist.at(cardbuttonid) >update(); 11

cardgroup cardgroup.ui Saját vezérlő használata Qt Designer ben 12

cardgroup cardgroup.ui Saját vezérlő elhelyezése az űrlapon cardbuttongroup 13

Az alkalmazás osztálydiagramja mod02 mod02 mod03 14

card card.h, card.cpp Card osztály #include <Qpixmap> card.h class Card public: Card(QString text, QPixmap pixmap); QPixmap getpixmap()return mpixmap; QString gettext()return mtext; QString tostring(); private: QString mtext; QPixmap mpixmap; ; typedef QList<Card*> CardList; Card::Card(QString text, QPixmap pixmap) card.cpp : mtext(text), mpixmap(pixmap) QString Card::toString() QString ret = " Text=" + mtext + " PixmapValid = " + QString::number(!mPixmap.isNull()) + " "; return ret; 15

cardpackset cardpackset.h Kártyacsomagok tárolása name.txt back.* képfájlok 16

CardPack osztály: definíció cardpack cardpack.h cardpack.h class CardPack public: CardPack(); ~CardPack(); QString getname()return mname; Card* getback()return mback; CardList &getfaces()return mfaces; Card* getface(int index); QPixmap getfacepixmap(int index); QString getfacetext(int index); void shufflecards(); bool loadcardpack(const QString &subdirpath) ; QString tostring(); private: QString mname; Card* mback; //updated by constructor CardList mfaces; ; typedef QList<CardPack*> CardPackList; 17

Kártya csomag osztály implementálása cardpack.cpp cardpack cardpack.cpp CardPack::CardPack() : mname(""), mback(0) CardPack::~CardPack() while (!mfaces.isempty()) delete mfaces.takefirst(); delete mback; Card* CardPack::getFace(int index) return mfaces.at(index); QPixmap CardPack::getFacePixmap(int index) return mfaces.at(index) >getpixmap(); QString CardPack::getFaceText(int index) return mfaces.at(index) >gettext(); 18

cardpack cardpack.cpp : loadcardpack Kártyacsomag betöltése: csomag neve cardpack.cpp name.txt betöltése bool CardPack::loadCardPack(const QString &subdirpath) //read name.txt QFile namefile(subdirpath + "/name.txt"); //name.txt exists!!! if(!namefile.open(qiodevice::readonly QIODevice::Text)) qwarning(qstring("warning: ** name.txt file is missing or not a text file. ** \nsubdirpath \"" + subdirpath + "\"").toascii()); return false; QTextStream in(&namefile); while (!in.atend()) mname += in.readline();... 19

Kártyacsomag hátlapjának betöltése, kártya létrehozása cardpack cardpack.cpp : loadcardpack cardpack.cpp hátlap betöltése... QStringList imagefilters; //Create filters for images foreach (QByteArray format, QImageReader::supportedImageFormats()) imagefilters += "*." + format; //Load back.* QStringList allfiles; foreach(qstring file, QDir(subDirPath).entryList(imageFilters, QDir::Files)) allfiles += QFileInfo(QDir(subDirPath),file).baseName(); if(!allfiles.contains("back")) qwarning(qstring("warning: ** Back file is missing from the \n\"" + subdirpath + "\"\ndirectory.").toascii()); return false; QStringList backfiles; foreach(qstring file, QDir(subDirPath).entryList(QStringList("back.*"), QDir::Files)) backfiles += QFileInfo(QDir(subDirPath),file).fileName(); QString backfile = backfiles.at(0); //Take the first back.* mback = new Card("Back",QPixmap(subDirPath + "/" + backfile));... 20

Kártyacsomag előlapjainak betöltése cardpack cardpack.cpp : loadcardpack cardpack.cpp előlapok betöltése... //Load faces //Add faces to subdir's pack but skip backs mfaces.clear(); foreach(qstring file, QDir(subDirPath).entryList(imageFilters, QDir::Files)) if (! (file.startswith("back."))) mfaces.append(new Card(file, QPixmap(subDirPath + "/" + file))); return true; 21

Kártyacsomag előlapjainak keverése, szövegesítése cardpack cardpack.cpp : loadcardpack cardpack.cpp void CardPack::shuffleCards() for (int i= 0; i < mfaces.size() * mfaces.size(); ++i) int ind1 = Utils::getNextRandomNumber(mFaces.size()); int ind2 = Utils::getNextRandomNumber(mFaces.size()); while(ind1 == ind2) ind2 = Utils::getNextRandomNumber(mFaces.size()); qswap(mfaces[ind1],mfaces[ind2] ); // <QtAlgorithms> előlapok keverése QString CardPack::toString() QString ret = "\npack name = " + mname + "\n"; előlapok ret += QString("Back: %1\n").arg(mBack >tostring()); szövegesítése for (int i = 0; i < mfaces.size(); ++i) ret += QString("\t Face #%1: %2 \n").arg(i).arg(mfaces.at(i) >tostring()); return ret; 22

cardpackset osztálydiagram CardPackSet osztály 23

CardPackSet : definíció cardpackset.h cardpackset cardpackset.h #include "cardpack.h" class CardPackSet public: CardPackSet(); ~CardPackSet(); void loadfromappresource(); void loadfromappdirectory(const QString &dir = "/packs"); void loadfrompath(const QString &path); CardPackList getpacklist()return mcardpacklist;; QStringList getpacknames(); CardPack* getbyname(const QString& name); CardPack* getbyindex(const int i); private: CardPackSet(const CardPackSet&); CardPackSet& operator=(const CardPackSet&); private: CardPackList mcardpacklist; ; 24

CardPackSet : konstruktor, destruktor cardpackset cardpackset.cpp cardpackset.cpp CardPackSet::CardPackSet() CardPackSet::~CardPackSet() while (!mcardpacklist.isempty()) delete mcardpacklist.takefirst(); #include <QDir> #include <QImageReader> #include <QString> #include <QFileInfo> #include <QImage> #include <QPixmap> #include <QFile> #include <QTextStream> #include <QMessageBox> #include "utils.h" #include "cardpackmanager.h" #include "cardpack.h" 25

CardPackSet osztály: getek cardpackset cardpackset.cpp cardpackset.cpp QStringList CardPackSet::getPackNames() QStringList packnames; foreach(cardpack *pack, mcardpacklist) packnames += pack >getname(); return packnames; CardPack* CardPackSet::getByName(const QString& name) CardPack *cardpack = NULL; foreach(cardpack *pack, mcardpacklist) if (name == pack >getname()) cardpack = pack; return cardpack; CardPack* CardPackSet::getByIndex(const int index) CardPack *cardpack = NULL; if(index < mcardpacklist.size()) cardpack = mcardpacklist.at(index); return cardpack; 26

CardPackSet osztály: kártyacsomagok betöltése cardpackset cardpackset.cpp : load... cardpackset.cpp void CardPackSet::loadFromAppResource() loadfrompath(qstring(":/datafiles/packs")); void CardPackSet::loadFromAppDirectory(const QString &dir) loadfrompath(utils::getapplicationdirprefix() + dir); card.qrc <!DOCTYPE RCC> <RCC version="1.0"> <qresource> <file alias="datafiles/packs/default.pack/name.txt">datafiles/packs/default.pack/name.txt</file> <file alias="datafiles/packs/default.pack/back.png">datafiles/packs/default.pack/back.png</file> <file alias="datafiles/packs/default.pack/01.jpg">datafiles/packs/default.pack/01.jpg</file>... <file alias="datafiles/packs/default.pack/12.jpg">datafiles/packs/default.pack/12.jpg</file> <file alias="datafiles/packs/default.pack/13.jpg">datafiles/packs/default.pack/13.jpg</file> <file alias="datafiles/packs/default.pack/14.jpg">datafiles/packs/default.pack/14.jpg</file> </qresource> </RCC> 27

CardPackSet osztály: csomagok betöltése cardpackset cardpackset.cpp : load... cardpackset.cpp void CardPackSet::loadFromPath(const QString &path) mcardpacklist.clear(); QDir packsdir(path); //Create subdirs of packs directory without. and.. QStringList subdirs; foreach (QString subdir, packsdir.entrylist(qdir::dirs QDir::NoDotAndDotDot)) subdirs += subdir; for (int i = 0; i < subdirs.size(); ++i) QString subdirpath = path + "/" + subdirs.at(i); QDir subdir(subdirpath); CardPack *pack = new CardPack(); if(pack >loadcardpack(subdirpath)) mcardpacklist.append(pack); 28

Kártya nézegető (cardviewer) alkalmazás cardviewer cardviewer 29

A kártya nézegető alkalmazás osztálydiagramja cardviewer osztálydiagram cardviewer - osztálydiagram 30

A kártya nézegető alkalmazás osztálydiagramja cardviewer osztálydiagram cardviewer - osztálydiagram Qt Designer programozás 31

Az alkalmazás felületterve cardviewer mainform.ui mainform.ui packcombobox cardbuttongroup 32

CardViewer: mainform.h mainform.h #include <QWidget> cardviewer mainform.h #include "ui_mainform.h" class CardPackSet; class MainForm : public QWidget, private Ui_MainForm Q_OBJECT public: MainForm(QWidget *parent = 0); public slots: void on_packcombobox_currentindexchanged(int index); void slotcardclicked(int i); private: CardPackSet* mcardpackset; ; 33

CardViewer: mainform.cpp cardviewer mainform.cpp mainform.cpp #include <QMessageBox> #include <math.h> #include "cardpackset.h" #include "cardbutton.h" #include "mainform.h" MainForm::MainForm(QWidget *parent) : QWidget(parent) setupui(this); mcardpackset = new CardPackSet(); mcardpackset >loadfromappdirectory(); packcombobox >additems(mcardpackset >getpacknames()); packcombobox >setcurrentindex(0); connect(cardbuttongroup, SIGNAL(cardButtonClicked(int)), this, SLOT(slotCardClicked(int))); 34

CardViewer: mainform.cpp cardviewer mainform.cpp mainform.cpp void MainForm::on_packComboBox_currentIndexChanged(int index) int side = (int) sqrt(mcardpackset >getpacklist().at(index) >getfaces().count()) + 1; //<math.h> cardbuttongroup >newcardbuttongroup(side,side); for (int i= 0; i< mcardpackset >getpacklist().at(index) >getfaces().count(); i++) cardbuttongroup >updatecardbuttonpixmap(i, QPixmap(mCardPackSet >getpacklist().at(index) >getfacepixmap(i))); QString text = mcardpackset >getpacklist().at(index) >getfaces().at(i) >gettext(); cardbuttongroup >getcardbutton(i) >settooltip(text.left(text.indexof("."))); void MainForm::slotCardClicked(int i) QMessageBox::information(this, "Card Group Test Information", "Card Click \ncardid = " + QString::number(i) ); 35

Fordítás, futtatás main.cpp #include <QApplication> #include "mainform.h" int main (int argc, char *argv[]) QApplication app(argc,argv); MainForm *mainform = new MainForm; mainform >setwindowtitle("card Viewer Application"); mainform >show(); return app.exec(); qmake project qmake cardviewer.pro make./cardviewer 36

A bemutatott osztályok, az azokat tesztelő projektek, valamint a kártya nézegető alkalmazás programjai megtalálhatók a people.inf.elte.nacsa/qt4/eaf3/mod02/projects/ címen. 37