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

Post on 06-Sep-2019

18 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

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

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

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ő

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ó

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

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

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

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

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.

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

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”

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

20

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

programot.

21

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

programokat.

main.cppmillmain.uimillmain.ui.hhome.png

22

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

projektnek.

A projektbe fel kell venni a fájlokat.

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)

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)

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

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

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

30

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

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ű

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

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

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

41

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

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

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

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

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

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ő

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

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

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

top related