egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 elemi alkalmazások...

62
1 Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése II. II. II. II. II. II. II. II. II. II. C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával készítette: Szabóné Nacsa Rozália lektorálta: Párniczky Krisztina

Upload: others

Post on 06-Sep-2019

17 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

1

Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése Egy ablakos alkalmazás készítése

II. II. II. II. II. II. II. II. II. II. C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop C++ / Qt / KDevelop

felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával felhasználásával

készítette: Szabóné Nacsa Rozálialektorálta: Párniczky Krisztina

Page 2: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

2

Fájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – OlvasásFájlkezelés – Olvasás

Page 3: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

3

A Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációjaA Form osztály deklarációja

class Form: public QVBox {Q_OBJECT

public:Form(QWidget *parent=0, const char *name=0);

private:QHBox *hbox;QPushButton *quitButton;QPushButton *loadButton;QTextEdit * textEdit;QFile *file;QTextStream *stream;

public slots:void load();

};

#include <qwidget.h>#include <qvbox.h>

class QHBox;class QTextEdit;class QPushButton;class QFile;class QTextStream;

form.h

form.h

Page 4: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

4

A Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációja

Form::Form(QWidget *parent, const char *name):QVBox(parent,name){

setMargin(6);setSpacing(6);

textEdit = new QTextEdit(this);textEdit->setReadOnly( TRUE );

hbox = new QHBox(this);hbox->setMargin(6);hbox->setSpacing(6);quitButton = new QPushButton("Quit",hbox);loadButton = new QPushButton("Load",hbox);

connect(quitButton,SIGNAL(clicked()),this,SLOT(quit()));connect(loadButton,SIGNAL(clicked()),this,SLOT(load()));

}

#include <qhbox.h>#include <qtextedit.h>#include <qpushbutton.h>

#include <qfile.h>#include <qtextstream.h>#include <qstring.h>

#include <qfiledialog.h>

#include "form.h"

form.cpp

Page 5: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

5

A Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációjaA Form osztály implementációja

void Form::load(){

qWarning("Not implemented yet!");textEdit->clear();QString filename =

QFileDialog::getOpenFileName(QString::null, "Text (*.txt)", this, "file open", "Read - File open");if (!filename.isEmpty()){

file = new QFile(filename);if (file->open(IO_ReadOnly)) {

stream = new QTextStream(file);while (!stream->eof()) {

textEdit->insert(stream->readLine() + "\n");}

}}

}

form.cpp

Page 6: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

6

““““““““““Legyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példaLegyen Ön is milliomos” példa

Gomb + Gomb + képkép

Szerkeszthet őSzerkeszthet őszövegszöveg

LCD kijelzőLCD kijelző

Gomb csoportGomb csoport

Radio ButtonRadio Button

Gomb + szövegGomb + szöveg

Page 7: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

7

ÁllapotdiagramÁllapotdiagramÁllapotdiagramÁllapotdiagramÁllapotdiagramÁllapotdiagramÁllapotdiagramÁllapotdiagramÁllapotdiagramÁllapotdiagram

Válaszoló

Befejezte

Tovább megy

Bezár

JVAL

RVAL

PASSZ

VEG

KOV

ZAR

Page 8: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

8

Új projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt DesignerrelÚj projekt létrehozása Qt Designerrel

File/New/C++ Project:millFile/New/C++ Project:mill

File/New/Widget: File/New/Widget: MillMainMillMain

Page 9: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

9

F program beillesztéseőF program beillesztéseőF program beillesztéseőF program beillesztéseőF program beillesztéseőF program beillesztéseőF program beillesztéseőF program beillesztéseőF program beillesztéseőF program beillesztéseő

Page 10: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

10

A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai

TávtartóTávtartó

Page 11: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

11

texttext

endButton endButton

questionLabel questionLabel

ansGroup ansGroup

moneyValue moneyValue

nextButton nextButton

Az ablak felépítéseAz ablak felépítéseAz ablak felépítéseAz ablak felépítéseAz ablak felépítéseAz ablak felépítéseAz ablak felépítéseAz ablak felépítéseAz ablak felépítéseAz ablak felépítése

Page 12: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

12

A generált f programőA generált f programőA generált f programőA generált f programőA generált f programőA generált f programőA generált f programőA generált f programőA generált f programőA generált f programő

#include <qapplication.h>#include "millmain.h"

int main( int argc, char ** argv ){ QApplication a( argc, argv ); MillMain w; w.show(); a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); return a.exec();}

main.cpp

Page 13: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

13

this::endGame()

this::checkAnswer(int)

this::nextQuestion()

Signál/Slot kötésekSignál/Slot kötésekSignál/Slot kötésekSignál/Slot kötésekSignál/Slot kötésekSignál/Slot kötésekSignál/Slot kötésekSignál/Slot kötésekSignál/Slot kötésekSignál/Slot kötések

Page 14: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

14

Saját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/SlotsSaját slotok beillesztése - Edit/Slots

Function: CheckAnswer(int)Return Type: voidSpecifier: virtualAccess: public

Function: endGame()Return Type: voidSpecifier: virtualAccess: public

Function: nextQuestion()Return Type: voidSpecifier: virtualAccess: public

Page 15: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

15

Edit/ConnectionsEdit/ConnectionsEdit/ConnectionsEdit/ConnectionsEdit/ConnectionsEdit/ConnectionsEdit/ConnectionsEdit/ConnectionsEdit/ConnectionsEdit/Connections

connect( nextButton, SIGNAL( clicked() ), this, SLOT( nextQuestion() ) ); connect( ansGroup, SIGNAL( clicked(int) ), this, SLOT( checkAnswer(int) ) ); connect( endButton, SIGNAL( clicked() ), this, SLOT( endGame() ) );

Sender: nextButtonSignal: clicked()Receiver: MillMainSlot: nextQuestion()

Sender: ansGroupSignal: clicked(int)Receiver: MillMainSlot: checkAnswer(int)

Sender: endButtonSignal: clicked()Receiver: MillMainSlot: endGame()

Page 16: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

16

Qt designer

UIC

millmain.cpp main.cpp

form.ui

Írás, olvasásOlvasásGenerálás#includesEszköz (tool)Generált forráskódFelhasználó forráskódja

millmain.h

millmain.ui

millmain.ui.h

Itt adjuk meg az eseménykezel k őimplemenációját.

Page 17: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

17

Fordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/Futtatás

TEMPLATE = appINCLUDEPATH += .

# InputHEADERS += millmain.ui.hINTERFACES += millmain.uiSOURCES += main.cpp

1. qmake –project2. qmake mill.pro3. make4. ./mill

mill.pro

Page 18: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

18

A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”A Qt Designer és a KDevelop “összekapcsolása”

Page 19: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

19

Project/New project ...Project/New project ...Project/New project ...Project/New project ...Project/New project ...Project/New project ...Project/New project ...Project/New project ...Project/New project ...Project/New project ...

Page 20: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

20

Vegyük ki a projektb l a mill.cpp ő

programot.

Page 21: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

21

Másoljuk át a projekt alá a Qt Designer-ben elkészített

programokat.

main.cppmillmain.uimillmain.ui.hhome.png

Page 22: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

22

Az itt található fájlok nem feltétlenül részei a

projektnek.

A projektbe fel kell venni a fájlokat.

Page 23: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

23

Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)Fordítás: Build/ Rebuild project...(F8)

Page 24: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

24

Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9) Futtatás: Build/ Execute Main program( Shift F9)

Page 25: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

25

MillMain

QApplication

QuestionIterator

Bevezetünk egy új osztályt a kérdések

kezelésére.

Új osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetéseÚj osztály bevezetése

Page 26: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

26

question: a kérdés szövegeanswers: a lehetséges válaszokat tartalmazó négyelem tömbűgood: a helyes válasz indexevalue: a kérdés értékeexplanation: további információ a kérdéssel kapcsolatban

struct Question {string question;string answers[4];int good;int value;string explanation;

};

Question típus (struct)Question típus (struct)Question típus (struct)Question típus (struct)Question típus (struct)Question típus (struct)Question típus (struct)Question típus (struct)Question típus (struct)Question típus (struct)

Page 27: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

27

Bejáró m veletekűfirst(): Az els kérdésre áll.őnext(): A következ kérdésre áll.őend(): Visszaadja, hogy a kérdéssor végére értünk-e.current(): Az aktuális kérdést adja vissza.

Segédfüggvények:fallbackValue: Hibás válasz esetén visszaadja a nyeremény összegét.previousValue: Megállás esetén visszaadja a nyeremény összegét.

QuestionIterator típusQuestionIterator típusQuestionIterator típusQuestionIterator típusQuestionIterator típusQuestionIterator típusQuestionIterator típusQuestionIterator típusQuestionIterator típusQuestionIterator típus

Page 28: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

28

A QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbeA QuestionIterator beillesztése a projektbe

Page 29: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

29

““““““““““ui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezet

Qt designer

UIC

millmain.cpp main.cpp

form.ui

Írás, olvasásOlvasásGenerálás#includesEszköz (tool)Generált forráskódFelhasználó forráskódja

millmain.h

millmain.ui

millmain.ui.h

Az alkalmazásspecifius Az alkalmazásspecifius funkciókat a millmain.ui.h funkciókat a millmain.ui.h

implementációs fájlban implementációs fájlban adjuk meg.adjuk meg.

question-iterator.cpp

question-iterator.h

Page 30: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

30

Page 31: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

31

class QFile;class QTextStream;

class QuestionIterator {public:

QuestionIterator(const QString& fn);~QuestionIterator();void first();void next();bool end();const Question& current();int fallBackValue();int previousValue();

private:Question _current;QFile *file;QTextStream *stream;int _level;

static const int _maxlevels=16;static const int money[ _maxlevels ];void readnext();

};

struct Question {QString question;QString answers[4];int good;int value;QString explanation;

};

questioniterator.h

QuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definícióQuestionIterator: definíció

#include <qstring.h> #include <qtextstream.h> using namespace std;

Page 32: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

32

const int QuestionIterator::money[_maxlevels]= {0,5000,10000,25000,50000,100000, 200000,300000,500000,800000,1500000, 3000000,5000000,10000000,20000000,40000000};

questioniterator.cpp

Kifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeőKifizethet összegek tömbjeő

QuestionIterator::QuestionIterator(const QString& fn):_level(0){file = new QFile(fn);

} questioniterator.cpp

QuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktorQuestionIterator: destruktor

QuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktorQuestionIterator: konstruktor

QuestionIterator::~QuestionIterator(){if(stream) delete stream;if (file){ file->close(); delete file;}

}

questioniterator.cpp

Page 33: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

33

void QuestionIterator::first() { if (!file) return; if(!file->open(IO_ReadOnly)){

qWarning(QString("Warning: Failed to open '%1'").arg(file->name()));file->close();return;

} _level=0; if (file) { stream = new QTextStream(file); readnext(); }}

void QuestionIterator::next(){ readnext();}

bool QuestionIterator::end() {return (_level == _maxlevels);}

const Question& QuestionIterator::current(){return _current;}

questioniterator.cpp

QuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: BejárókQuestionIterator: Bejárók

Page 34: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

34

int QuestionIterator::fallBackValue() {return money[(_level/5)*5];}

int QuestionIterator::previousValue() { return money[_level-1];}

questioniterator.cpp

const int QuestionIterator::money[_maxlevels]= {0,5000,10000,25000,50000,100000, 200000,300000,500000,800000,1500000, 3000000,5000000,10000000,20000000,40000000};

QuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvényekQuestionIterator: segédfüggvények

Page 35: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

35

<kérdés szövege><els válasz>ő<második válasz><harmadik válasz><negyedik válasz><helyes válasz indexe (0..3)><magyarázat>

Melyik Andrew Lloyd Webber legújabb m ve?űWhistle down the WindowThe Beautiful GameEvitaLes Miserables1A Les Mis nem Webber, hanem Schönberg-Boublil musical. A B.G. bemutatója 2000. szeptemberében volt.<

Mennyi ideig tartott a harminc éves háború?. . .

Kérdések fájljaKérdések fájljaKérdések fájljaKérdések fájljaKérdések fájljaKérdések fájljaKérdések fájljaKérdések fájljaKérdések fájljaKérdések fájlja

Page 36: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

36

void QuestionIterator::rednext() { if (!file) return; if (_level != _maxlevels) { _current.question=stream->readLine(); for (int i=0; i<4; i++) { _current.answers[i]= stream->readLine(); } _current.good = stream->readLine().toInt(); _current.explanation=""; QString line = stream->readLine(); while(line[0] != '<') { _current.explanation+='\n'; _current.explanation+=line; line = stream->readLine() } _level++; _current.value=money[_level]; }}

questioniterator.cpp

Beolvasó m veletűBeolvasó m veletűBeolvasó m veletűBeolvasó m veletűBeolvasó m veletűBeolvasó m veletűBeolvasó m veletűBeolvasó m veletűBeolvasó m veletűBeolvasó m veletű

Page 37: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

37

Eseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaőEseménykezel k implementálásaő

Page 38: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

38

Adattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztéseAdattagok és függvények beillesztése

class MillMain : public QWidget {Q_OBJECT

public:MillMain(QWidget *parent=0, const char *name=0);~MillMain();

public slots:void newQuestion();void endGame();void checkAnswer(int);

protected: QuestionIterator* _qi; bool canClose;private: void displayQuestion();}; Ezt a fájlt az uic generálja

millmain.h

Page 39: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

39

Qt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadásaQt Designer: függvény megadása

Edit/Slots ...

Page 40: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

40

Qt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadásaQt Designer: Változó megadása

Page 41: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

41

Page 42: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

42

““““““““““Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() Konstruktor” - MillMain::init() void MillMain::init() { QString filename =QFileDialog::getOpenFileName(QString::null, tr(QString::fromUtf8("Questions (*.txt)")),this, tr(QString::fromUtf8("File Open")), tr(QString::fromUtf8( "Milliomos1: Kérdés fájl kiválasztása"))); if (!filename.isEmpty()) { _qi = new QuestionIterator(filename); _qi->first(); displayQuestion(); }else { questionLabel->setText("Nincs kérdés!"); for (int i=0; i<4; i++) { ((QRadioButton*)ansGroup->find(i))->setText(""); ((QRadioButton*)ansGroup->find(i))->setChecked(false); } moneyValue->display(_qi->current().value); text->setText(""); nextButton->setEnabled(false); ansGroup->setEnabled(false); endButton->setEnabled(false); } canClose =false;}

millmain.ui.h

Ez a program automatikusan lefut a konstruktor után.

Page 43: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

43

ha még nem értünk a kérdés iterátor végéreaz aktuális kérdés adatainak megjelenítése a megfelel widgetekbenőa next nyomógomb letiltásaaz ansGroup rádiógomb-csoport engedélyezéseaz endButton nyomógomb engedélyezése

ha a kérdésiterártor végére értünka nextButton letiltásaaz ansGroup rádiógomb-csoport engedélyezésea vége üzenet kiírása

MillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezésMillMain::displayQuestion() - tervezés

Page 44: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

44

void MillMain::displayQuestion() { if (!_qi->end()) { questionLabel->setText(_qi->current().question); for (int i=0; i<4; i++) { ((QRadioButton*)ansGroup->find(i))->setText(_qi->current().answers[i]); ((QRadioButton*)ansGroup->find(i))->setChecked(false); } moneyValue->display(_qi->current().value); text->setText(""); nextButton->setEnabled(false); ansGroup->setEnabled(true); endButton->setEnabled(true); }else { nextButton->setEnabled(false); moneyValue->setSegmentStyle(QLCDNumber::Filled); text->setText("\n GAME OVER \n"); }}

MillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolásMillMain::displayQuestion() - kódolás

millmain.ui.h

Page 45: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

45

connect( nextButton, SIGNAL( clicked() ), this, SLOT( nextQuestion() ) );

void MillMain::nextQuestion() { _qi->next(); displayQuestion();}

1. Ráállunk a következ kérdésreő1. Ráállunk a következ kérdésreő2. Megjelenítjük a kérdést2. Megjelenítjük a kérdést

MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()MillMain::nextQuestion()

millmain.ui.h

Page 46: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

46

connect( ansGroup, SIGNAL( clicked(int) ), this, SLOT( checkAnswer(int) ) );

az aktuális kérdéshez tartozó magyarázat megjelenítése

a válasz ellen rzéseő

jó válasz esetén:

a nextButton gomb engedélyezése

rossz válasz esetén:

a nyeremény megjelenítése

a vége üzenet kiírása

az ansGroup rádiógomb-csoport letiltása

az endButton nyomógomb letiltása

MillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezésMillMain::checkAnswer(int) - tervezés

Page 47: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

47

void MillMain::checkAnswer( int sel ){ text->setText(_qi->current().explanation); ansGroup->setEnabled(false); endButton->setEnabled(false); if (sel ==_qi->current().good) { nextButton->setEnabled(true); } else { moneyValue->display(_qi->fallBackValue()); moneyValue->setSegmentStyle(QLCDNumber::Filled); text->append("\n GAME OVER\n"); } }

millmain.ui.h

MillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolásMillMain::checkAnswer(int) - kódolás

Page 48: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

48

connect( endButton, SIGNAL( clicked() ), this, SLOT( endGame() ) );

a nyeremény megjelenítése a nextButton gomb letiltása az ansGroup rádiógomb-csoport letiltása az endButton nyomógomb letiltása az aktuális kérdéshez tartozó magyarázat megjelenítése a vége üzenet kiírása

MillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezésMillMain::endGame() - tervezés

Page 49: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

49

void MillMain::endGame(){ moneyValue->display(_qi->previousValue()); moneyValue->setSegmentStyle(QLCDNumber::Filled); nextButton->setEnabled(false); ansGroup->setEnabled(false); endButton->setEnabled(false); text->setText(_qi->current().explanation); text->append("\n GAME OVER"); canClose = true;}

millmain.ui.h

MillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolásMillMain::endGame() - kódolás

Page 50: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

50

closeEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálásacloseEvent() felüldefiniálása

void MillMain::closeEvent( QCloseEvent *event ){ if(canClose) emit close();}

millmain.ui.h

Page 51: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

51

Fordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/Futtatás

Page 52: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

52

Ellen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezeléső

Page 53: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

53

Ellen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezelésőEllen rzött adatkezeléső

A szám legyen 1000-A szám legyen 1000-nél kisebb.nél kisebb.

Csak számot lehet Csak számot lehet begépelni.begépelni.

Nulla osztó esetén Nulla osztó esetén letiltjuk a számol letiltjuk a számol

gombot.gombot.

Page 54: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

54

ValidátorokValidátorokValidátorokValidátorokValidátorokValidátorokValidátorokValidátorokValidátorokValidátorok

QValidatorQValidator

QIntValidatorQIntValidator QDoubleValidatorQDoubleValidator QRegExpValidatorQRegExpValidator

Page 55: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

55

Vezérl k őVezérl k őVezérl k őVezérl k őVezérl k őVezérl k őVezérl k őVezérl k őVezérl k őVezérl k ő

op1 op2 result

calcButton endButton

Page 56: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

56

. . . // signals and slots connections connect( calcButton, SIGNAL( clicked() ), this, SLOT( calculate() ) ); connect( endButton, SIGNAL( clicked() ), this, SLOT( close() ) ); connect( op1, SIGNAL( textChanged(const QString&) ), this, SLOT( enableCalcButton(const QString&) ) ); connect( op2, SIGNAL( textChanged(const QString&) ), this, SLOT( enableCalcButton(const QString&) ) ); . . .

Signál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatokSignál/slot kapcsolatok

Page 57: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

57

#ifndef NUMMAIN_H#define NUMMAIN_H

#include <nummainbase.h>#include <qvalidator.h>

class NumMain : public NumMainBase { public:

NumMain(QWidget *parent=0,const char *name=0);public slots: void calculate(); void enableCalcButton(const QString &);private: QIntValidator *v;};

#endif

nummain.h

NumMain osztályNumMain osztályNumMain osztályNumMain osztályNumMain osztályNumMain osztályNumMain osztályNumMain osztályNumMain osztályNumMain osztály

Page 58: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

58

A konstruktor feladatai:

validátor objektum létrehozásaa validátor hozzárendelése a soreditorhoz

NumMain::NumMain(QWidget *parent,const char *name): NumMainBase(parent,name){ v=new QIntValidator(this); op1->setValidator(v); op2->setValidator(v);} nummain.cpp

NumMain konstruktorNumMain konstruktorNumMain konstruktorNumMain konstruktorNumMain konstruktorNumMain konstruktorNumMain konstruktorNumMain konstruktorNumMain konstruktorNumMain konstruktor

Page 59: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

59

A calc nyomógomb clicked() szignáljához kötött slot feladatai:Számmá konvertálja a soreditor szövegét.Kiszámítja az összeget.Megjeleníti az eredményt a képerny n.ő

void NumMain::calculate(){ result->display(op1->text().toInt() / op2->text().toInt());}

cnummain.cpp

calculate() slotcalculate() slotcalculate() slotcalculate() slotcalculate() slotcalculate() slotcalculate() slotcalculate() slotcalculate() slotcalculate() slot

Page 60: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

60

Az op1 op2 soreditorok textChanged() szignáljához kötött slot feladatai:Számmá konvertálja a soreditor szövegét.A Számol gombot engedélyezi / letiltja

void NumMain::enableCalcButton(const QString &){ calcButton->setEnabled(op2->text().toInt() > 0 && op2->text().toInt() < 1000 && op1->text().toInt() >= 0 && op1->text().toInt() < 1000);}

nummain.cpp

enableCalcButton()enableCalcButton()enableCalcButton()enableCalcButton()enableCalcButton()enableCalcButton()enableCalcButton()enableCalcButton()enableCalcButton()enableCalcButton()

Page 61: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

61

#include <qapplication.h>#include "nummain.h"

int main( int argc, char ** argv ){ QApplication a( argc, argv ); NumMain *w = new NumMain; w->show(); a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) ); return a.exec();}

main.cpp

F programőF programőF programőF programőF programőF programőF programőF programőF programőF programő

Page 62: Egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 Elemi alkalmazások fejlesztése III.Elemi alkalmazások fejlesztése III. Egy ablakos alkalmazás készítése

62

VégeVégeVégeVégeVégeVégeVégeVégeVégeVége