elemi alkalmazások fejlesztése iii. bemutato handout ff.pdf · ő

16
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 3 A Form osztály deklarációja A Form osztály deklarációja A Form osztály deklarációja A Form osztály deklarációja A Form osztály deklarációja A Form osztály deklarációja A Form osztály deklarációja A Form osztály deklarációja A Form osztály deklarációja A 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 4 A Form osztály implementációja A Form osztály implementációja A Form osztály implementációja A Form osztály implementációja A Form osztály implementációja A Form osztály implementációja A Form osztály implementációja A Form osztály implementációja A Form osztály implementációja A 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

Upload: others

Post on 06-Sep-2019

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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

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 2: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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

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 3: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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 4: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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 5: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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 6: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő
Page 7: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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)

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 8: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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;

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 9: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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

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

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 10: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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ő

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 11: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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.

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

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 12: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

46

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

az aktuális kérdéshez tartozó magyarázat megjelenítésea 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

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

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 13: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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

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 14: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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.

54

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

QValidatorQValidator

QIntValidatorQIntValidator QDoubleValidatorQDoubleValidator QRegExpValidatorQRegExpValidator

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

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 15: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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

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

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

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 16: Elemi alkalmazások fejlesztése III. bemutato handout ff.pdf ·  ő

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ő

62

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