egy ablakos alkalmazás készítése - people.inf.elte.hu bemutato.pdf · 1 elemi alkalmazások...
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