-
1
Elemi alkalmazások fejlesztése IIIElemi alkalmazások fejlesztése
IIIElemi alkalmazások fejlesztése IIIElemi alkalmazások fejlesztése
IIIElemi alkalmazások fejlesztése IIIElemi alkalmazások fejlesztése
IIIElemi alkalmazások fejlesztése IIIElemi alkalmazások fejlesztése
IIIElemi alkalmazások fejlesztése IIIElemi alkalmazások fejlesztése
III
Készítette:Szabóné Nacsa Rozália
Steingart Ferenc
C++/ Qt alapúC++/ Qt alapúSDI alkalmazás készítéseSDI alkalmazás
készítése
III. III.
-
2
Készítettünk egy Qt SDI alkalmazást.Készítettünk egy Qt SDI
alkalmazást.
Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:
-
3
Megterveztük a view Megterveztük a view osztály felhasználói
osztály felhasználói felületét.felületét.
Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:
-
4
Megvalósítottuk a számla típust. Megvalósítottuk a számla
típust.
Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:
-
5
Megvalósítottuk a számlatétel típust. Megvalósítottuk a
számlatétel típust.
Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:
-
6
#include "invoicerview.h"#include #include
InvoicerView::InvoicerView(QWidget *parent, InvoicerDoc *doc) :
InvoicerViewBase(parent) { /** connect doc with the view*/
connect(doc, SIGNAL(documentChanged()), this,
SLOT(slotDocumentChanged())); connect(customer,
SIGNAL(textChanged(const QString&)), doc,
SLOT(setCustomer(const QString&))); connect(zip,
SIGNAL(textChanged(const QString&)), doc, SLOT(setZip(const
QString&))); . . . connect(fulfilled, SIGNAL(textChanged(const
QString&)), doc, SLOT(setFulfilled(const QString&)));
connect(dueTo, SIGNAL(textChanged(const QString&)), doc,
SLOT(setDueTo(const Qstring&)));
}
Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:
Összekapcsoltuk számlát (doc) Összekapcsoltuk számlát (doc) és a
view osztályt.és a view osztályt.
-
7
Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:Ami már kész van:Ami már kész
van:Ami már kész van:Ami már kész van:
Megvalósítottuk a számlatétel Megvalósítottuk a számlatétel
felvitele, módosítása, törlése felvitele, módosítása, törlése
funkciókat.funkciókat.
-
8
InvoicerView
InvoicerDoc
Invoicer
InvoicItem
ListViewInvoiceItem
InvoiceItem* _i;
QListViewItem
InvItemDia
QDialog
Az alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramja
-
9
Ami még hátra van:Ami még hátra van:Ami még hátra van:Ami még
hátra van:Ami még hátra van:Ami még hátra van:Ami még hátra van:Ami
még hátra van:Ami még hátra van:Ami még hátra van:
(Számlafejléc tar talmának megadása)(Számlatétel
hozzáadása)(Számlatétel módosítása)(Számlatétel tör lése)Beviteli
mez k ellen rzéseő őSzámla mentése fájlbaSzámla betöltése
fájlból
-
10
Beviteli mez k ellen rzéseő őBeviteli mez k ellen rzéseő
őBeviteli mez k ellen rzéseő őBeviteli mez k ellen rzéseő őBeviteli
mez k ellen rzéseő őBeviteli mez k ellen rzéseő őBeviteli mez k
ellen rzéseő őBeviteli mez k ellen rzéseő őBeviteli mez k ellen
rzéseő őBeviteli mez k ellen rzéseő ő
View osztályirányítószám (négyelem , regulárisű )számlaszám
(csak számjegy)dátumok (illeszkedés egy mintára+dátum ellen rzéső
)
Számlatétel dialógusdarabszám (numerikus)egységár
(numerikus)
-
11
Ellen rz objektumok: validátorokő őEllen rz objektumok:
validátorokő őEllen rz objektumok: validátorokő őEllen rz
objektumok: validátorokő őEllen rz objektumok: validátorokő őEllen
rz objektumok: validátorokő őEllen rz objektumok: validátorokő
őEllen rz objektumok: validátorokő őEllen rz objektumok:
validátorokő őEllen rz objektumok: validátorokő ő
Cél: adatbevitel Cél: adatbevitel korlátozásakorlátozása
QObject
QValidator
QIntValidator QDoubleValidator
Beépített Beépített validátorok.validátorok.
-
12
QValidator : QValidator : QValidator : QValidator : QValidator :
QValidator : QValidator : QValidator : QValidator : QValidator :
validate(), fixup()validate(), fixup()
vir tual State validate (QStr ing &txt, int &pos) const
= 0;A txt szöveget ellen rzi.őVisszatérési értéke lehet:
Invalid: a szöveg nem elfogadhatóIntermediate: a szöveg még jó
lehet (közbüls állapot)őAcceptable: a szöveg elfogadható
vir tual void fixup (QStr ing &txt) const;“Kijavítja” a nem
elfogadható szöveget.
““tiszta virtuális függvény”tiszta virtuális függvény”
-
13
Adatellen rzés lépéseiőAdatellen rzés lépéseiőAdatellen rzés
lépéseiőAdatellen rzés lépéseiőAdatellen rzés lépéseiőAdatellen
rzés lépéseiőAdatellen rzés lépéseiőAdatellen rzés
lépéseiőAdatellen rzés lépéseiőAdatellen rzés lépéseiő
Ellen rz objektum ő ő létrehozása
Ellen rz objektum “viselkedésének” ő ő beállítása
Ellen rz objektum és az adatbeviteli mez “ő ő ő
összerendelése”
Példa (vázlat)
invoicerview.h : . . . QIntvalidator* invnov; . . .
//deklarációinvoicerview.cpp: . . . invnov = new QIntValidator
(this) . . . //létrehozás . . . invNo->setValidator(invnov) . .
. //összerendelés
-
14
Dátum ellen rzéséhez nincs beépített őDátum ellen rzéséhez nincs
beépített őosztály.osztály.
-
15
QValidator osztály: QValidator osztály: QValidator osztály:
QValidator osztály: QValidator osztály: QValidator osztály:
QValidator osztály: QValidator osztály: QValidator osztály:
QValidator osztály: StateState
“1111.11.11”
2003.04.062003.04.06:abc
Invalid Intermadiate Acceptable
minta:
StateState
-
16
Ellen rz objektumok: validátorokő őEllen rz objektumok:
validátorokő őEllen rz objektumok: validátorokő őEllen rz
objektumok: validátorokő őEllen rz objektumok: validátorokő őEllen
rz objektumok: validátorokő őEllen rz objektumok: validátorokő
őEllen rz objektumok: validátorokő őEllen rz objektumok:
validátorokő őEllen rz objektumok: validátorokő ő
Cél: adatbevitel Cél: adatbevitel korlátozásakorlátozása
QObject
QValidator
QIntValidator QDoubleValidator DateValidator
Beépített Beépített validátorok.validátorok.
Saját validátorSaját validátor
-
17
Az alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramja
InvoicerView
InvoicerDoc
Invoicer
InvoicItem
ListViewInvoiceItem
InvoiceItem* _i;
QListViewItem
InvItemDia
QDialogDatumValidator
QValidator
-
18
Dátum ellen rz osztály létrehozásaő őDátum ellen rz osztály
létrehozásaő őDátum ellen rz osztály létrehozásaő őDátum ellen rz
osztály létrehozásaő őDátum ellen rz osztály létrehozásaő őDátum
ellen rz osztály létrehozásaő őDátum ellen rz osztály létrehozásaő
őDátum ellen rz osztály létrehozásaő őDátum ellen rz osztály
létrehozásaő őDátum ellen rz osztály létrehozásaő ő
-
19
-
20
#include
class DateValidator : public QValidator { Q_OBJECTpublic:
DateValidator(QString pattern = "1111.11.11", QObject *parent=0,
const char *name=0): QValidator(parent,name), _pattern(pattern) {}
//üres törzs
virtual State validate(QString &, int &) const; virtual
void fixup(QString &) const;
private: bool match(const QChar &ch, int p) const; QString
_pattern;};
datevalidator.h
A A A A A A A A A A DateValidatorDateValidator osztály –
deklaráció osztály – deklaráció osztály – deklaráció osztály –
deklaráció osztály – deklaráció osztály – deklaráció osztály –
deklaráció osztály – deklaráció osztály – deklaráció osztály –
deklaráció
A szül őA szül őkonstruktor konstruktor
hívásahívása
Adattag Adattag inicializálásainicializálása
MintaillesztésMintaillesztésMintaMinta
A dátum validátort a A dátum validátort a QValidator osztályból
QValidator osztályból
származtatjuk.származtatjuk.
-
21
AAAAAAAAAA match() match() pr ivát függvény implementációja pr
ivát függvény implementációja pr ivát függvény implementációja pr
ivát függvény implementációja pr ivát függvény implementációja pr
ivát függvény implementációja pr ivát függvény implementációja pr
ivát függvény implementációja pr ivát függvény implementációja pr
ivát függvény implementációja
bool DateValidator::match(const QChar &ch, int p) const{ if
(p>=_pattern.length()) { return false;} if (_pattern[p]=='1') {
return ch.isDigit(); } else { return (ch == _pattern[p]); }}
datevalidator.cpp
“1111.11.11”
2003.04.06:
minta:
-
22
AAAAAAAAAAvalidate()validate() implementációja implementációja
implementációja implementációja implementációja implementációja
implementációja implementációja implementációja
implementációja#include #include "datevalidator.h"
QValidator::State DateValidator::validate(QString &txt, int
&pos) const{ int l=txt.length(); int i=0; for (;i
-
23
A A A A A A A A A A fixup()fixup() m velet implementációjaű m
velet implementációjaű m velet implementációjaű m velet
implementációjaű m velet implementációjaű m velet implementációjaű
m velet implementációjaű m velet implementációjaű m velet
implementációjaű m velet implementációjaű
void DateValidator::fixup (QString &txt) const{ QDateTime
day = QDateTime::currentDateTime(); txt = day.toString("yyyy") +
"." + day.toString("MM") + "." + day.toString("dd");}
datevalidator.cpp
Ez a függvény az Enter leütésekor, hibás adat esetén kerül
végrehajtásra.
-
24
A view osztályban létrehozunk két numerikus validátor adattagot
az irányítószám és a számlaszám mez khöz, valamint egy dátum
validátor adattagot a dátum őtípusú mez k ellen rzésére.ő ő
irányítószám: egy QRegExpValidator objektum az 1000..9999
értékek elfogadására (zipv)számlaszám: egy QIntValidator objektum
tetsz leges egész értékekő fogadására (invnov)dátumok: egy közös
DateValidator objektum a default mintával és dátum ellen rzéssel (ő
dv)
Ellen rz objektumok létrehozásaő őEllen rz objektumok
létrehozásaő őEllen rz objektumok létrehozásaő őEllen rz objektumok
létrehozásaő őEllen rz objektumok létrehozásaő őEllen rz objektumok
létrehozásaő őEllen rz objektumok létrehozásaő őEllen rz objektumok
létrehozásaő őEllen rz objektumok létrehozásaő őEllen rz objektumok
létrehozásaő ő
-
25
#include "datevalidator.h"
class InvoicerView : public InvoicerViewBase { private: void
initValidators();
protected: DateValidator* dv; QRegExpValidator* zipv;
QIntValidator* invnov; };
A módosított A módosított A módosított A módosított A módosított
A módosított A módosított A módosított A módosított A módosított
viewview osztály osztály osztály osztály osztály osztály osztály
osztály osztály osztály
InvoicerView::InvoicerView(QWidget *parent, InvoicerDoc *doc) :
InvoicerViewBase(parent){
initValidators(); . . .}
invoicerview.h
invoicerview.cpp
-
26
Validátorok inicializálásaValidátorok inicializálásaValidátorok
inicializálásaValidátorok inicializálásaValidátorok
inicializálásaValidátorok inicializálásaValidátorok
inicializálásaValidátorok inicializálásaValidátorok
inicializálásaValidátorok inicializálása
void InvoicerView::initValidators(){
QRegExp regExp("[1-9][0-9]{3,3}"); zipv = new
QRegExpValidator(regExp,this); zip->setValidator(zipv);
invnov=new QIntValidator(this);
invNo->setValidator(invnov);
dv=new DateValidator("1111.11.11",this);
released->setValidator(dv); fulfilled->setValidator(dv);
dueTo->setValidator(dv);
}
DateValidator* dv;QRegExpValidator* zipv;QIntValidator*
invnov;
invoicerview.cpp
-
27
Ellen rzés adatbevitel végénőEllen rzés adatbevitel végénőEllen
rzés adatbevitel végénőEllen rzés adatbevitel végénőEllen rzés
adatbevitel végénőEllen rzés adatbevitel végénőEllen rzés
adatbevitel végénőEllen rzés adatbevitel végénőEllen rzés
adatbevitel végénőEllen rzés adatbevitel végénőclass InvoicerView :
public InvoicerViewBase { . . . protected slots: void
slotDocumentChanged(); void slotDocItemAdded(InvoiceItem*);
void checkReleasedDate(); void checkFulfilledDate(); void
checkDueToDate(); };
InvoicerView::InvoicerView(QWidget *parent, InvoicerDoc *doc) :
InvoicerViewBase(parent){ initValidators(); . . . connect(released,
SIGNAL(lostFocus()), this, SLOT(checkReleasedDate()));
connect(fulfilled, SIGNAL(lostFocus()), this,
SLOT(checkFulfilledDate())); connect(dueTo, SIGNAL(lostFocus()),
this, SLOT(checkDueToDate())); connect(
doc,SIGNAL(itemInserted(InvoiceItem*)),
this,SLOT(slotDocItemAdded(InvoiceItem*)));}
invoicerview.cpp
Csak akkor léphetünk ki az Csak akkor léphetünk ki az
adatbeviteli mez b l, ha helyes az ő őadatbeviteli mez b l, ha
helyes az ő ő
adat. adat.
-
28
InvoicerView:: checkReleasedDate()InvoicerView::
checkReleasedDate()InvoicerView:: checkReleasedDate()InvoicerView::
checkReleasedDate()InvoicerView:: checkReleasedDate()InvoicerView::
checkReleasedDate()InvoicerView:: checkReleasedDate()InvoicerView::
checkReleasedDate()InvoicerView:: checkReleasedDate()InvoicerView::
checkReleasedDate()void InvoicerView::checkReleasedDate(){ if
(released->text()=="") { QDateTime day =
QDateTime::currentDateTime(); QString str = day.toString("yyyy") +
"." + day.toString("MM") + "." + day.toString("dd");
released->setText(str); return; } QString str =
released->text(); int p = 0; if
(released->validator()->validate(str,p) !=
QValidator::Acceptable) { QMessageBox::information( this,
"InvoicerView", "Invalid date! \nDate format: \"yyyy.mm.dd\" ");
released->setFocus(); }}
invoicerview.cpp
Ha a kibocsátás dátuma üres, Ha a kibocsátás dátuma üres, akkor
legyen ez a mai dátum.akkor legyen ez a mai dátum.
Ha a kibocsátás dátuma nem üres, Ha a kibocsátás dátuma nem
üres, de hibás, adjunk figyelmeztet őde hibás, adjunk figyelmeztet
ő
üzenetet.üzenetet.
-
29
InvoicerView:: checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView::
checkFulfilledDate()InvoicerView:: checkFulfilledDate()
void InvoicerView::checkFulfilledDate(){ QString str =
fulfilled->text(); int p = 0;
if(fulfilled->validator()->validate(str,p) !=
QValidator::Acceptable && str != "") {
QMessageBox::information( this, "InvoicerView", "Invalid date!
\nDate format: \"yyyy.mm.dd\" "); fulfilled->setFocus(); }}
invoicerview.cpp
A teljesítés dátuma lehet A teljesítés dátuma lehet
üres.üres.
-
30
InvoicerView:: checkDueToDate()InvoicerView::
checkDueToDate()InvoicerView:: checkDueToDate()InvoicerView::
checkDueToDate()InvoicerView:: checkDueToDate()InvoicerView::
checkDueToDate()InvoicerView:: checkDueToDate()InvoicerView::
checkDueToDate()InvoicerView:: checkDueToDate()InvoicerView::
checkDueToDate()void InvoicerView::checkDueToDate(){ if
(dueTo->text()=="") { QDateTime day =
QDateTime::currentDateTime().addDays(8); QString str =
day.toString("yyyy") + "." + day.toString("MM") + "." +
day.toString("dd"); dueTo->setText(str); return; } else {
QString str = dueTo->text(); int p = 0; if
(dueTo->validator()->validate(str,p) !=
QValidator::Acceptable) { QMessageBox::information( this,
"InvoicerView", "Invalid date! \nDate format: \"yyyy.mm.dd\" ");
dueTo->setFocus(); } }}
invoicerview.cpp
Ha a kiegyenlítés Ha a kiegyenlítés dátuma üres, akkor 8 dátuma
üres, akkor 8
napos fizetési határid t őnapos fizetési határid t őállítunk be.
állítunk be.
-
31
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
A számlántételen még A számlántételen még nincs adatellen
rzés.őnincs adatellen rzés.ő
A számlán A számlán megvalósítottuk az megvalósítottuk az
ellen rzött adatbevitelt.őellen rzött adatbevitelt.ő�
-
32
Qt designer
UIC
invitemdia.cpp
invoicer.h
invitemdia.ui
Írás, olvasásOlvasásGenerálás#includesEszköz (tool)Generált
forráskódFelhasználó forráskódja
invitemdia.h
invoicer.cpp
Számlatétel ellen rzéseőSzámlatétel ellen rzéseőSzámlatétel
ellen rzéseőSzámlatétel ellen rzéseőSzámlatétel ellen
rzéseőSzámlatétel ellen rzéseőSzámlatétel ellen rzéseőSzámlatétel
ellen rzéseőSzámlatétel ellen rzéseőSzámlatétel ellen rzéseő
A generált osztályba nem A generált osztályba nem tudjuk az
adatellen rzést őtudjuk az adatellen rzést ő
betenni.betenni.
-
33
Qt designer
UIC chekeditmdia.h
invitemdia.cpp
invoicer.h
invitemdia.ui
Írás, olvasásOlvasásGenerálás#includesEszköz (tool)Generált
forráskódFelhasználó forráskódja
Modulszerkezet Modulszerkezet Modulszerkezet Modulszerkezet
Modulszerkezet Modulszerkezet Modulszerkezet Modulszerkezet
Modulszerkezet Modulszerkezet
invitemdia.h
checkeditemdia.cpp
Örö
kldé
ső
invoicer.cpp
Az ellen rzést a őAz ellen rzést a őszármaztatott osztályban
származtatott osztályban
valósítjuk meg.valósítjuk meg.
-
34
Az alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramjaAz
alkalmazás osztálydiagramjaAz alkalmazás osztálydiagramja
InvoicerView
InvoicerDoc
Invoicer
InvoicItem
ListViewInvoiceItem
InvoiceItem* _i;
QListViewItem
InvItemDia
QDialogDatumValidator
QValidator
CheckedItemDia
-
35
A A A A A A A A A A CheckedItemDia CheckedItemDia osztály
létrehozása – 1osztály létrehozása – 1osztály létrehozása –
1osztály létrehozása – 1osztály létrehozása – 1osztály létrehozása
– 1osztály létrehozása – 1osztály létrehozása – 1osztály
létrehozása – 1osztály létrehozása – 1
-
36
A A A A A A A A A A CheckedItemDia CheckedItemDia osztály
létrehozása – 2osztály létrehozása – 2osztály létrehozása –
2osztály létrehozása – 2osztály létrehozása – 2osztály létrehozása
– 2osztály létrehozása – 2osztály létrehozása – 2osztály
létrehozása – 2osztály létrehozása – 2
-
37
#ifndef CHECKEDITEMDIA_H#define CHECKEDITEMDIA_H
#include #include #include
class CheckedItemDia : public InvItemDia { Q_OBJECTpublic:
CheckedItemDia(QWidget *parent,const char *name):
InvItemDia(parent,name,true), v(this) {
unitPrice->setValidator(&v);
quantity->setValidator(&v); }protected: QIntValidator
v;};
#endif
A A A A A A A A A A CheckedItemDiaCheckedItemDia osztály osztály
osztály osztály osztály osztály osztály osztály osztály osztály
checkeditemdia.h
A konstruktor törzsét is A konstruktor törzsét is itt adjuk meg,
ezért a itt adjuk meg, ezért a
konstruktor definícióját a konstruktor definícióját a
checkeditemdia.cpp checkeditemdia.cpp fájlból törölni kell.fájlból
törölni kell.
-
38
Az InvItemDia példányok “lecserélése”Az InvItemDia példányok
“lecserélése”Az InvItemDia példányok “lecserélése”Az InvItemDia
példányok “lecserélése”Az InvItemDia példányok “lecserélése”Az
InvItemDia példányok “lecserélése”Az InvItemDia példányok
“lecserélése”Az InvItemDia példányok “lecserélése”Az InvItemDia
példányok “lecserélése”Az InvItemDia példányok “lecserélése”
-
39
void InvoicerApp::slotItemsNew(){
statusBar()->message(tr("Inserting a new invoice item ..."));
//InvItemDia dlg(this,0,true); CheckedItemDia dlg(this,0); if
(dlg.exec() == QDialog::Accepted) { . . .}
void InvoicerApp::slotItemsEdit(){
statusBar()->message(tr("Modifying current item...")); if
(view->items->currentItem()) { //InvItemDia dlg(this,0,true);
CheckedItemDia dlg(this,0); InvoiceItem *ii = . . .}
#include "checkeditemdia.h"#include "checkeditemdia.h"
invoicer.cpp
Az InvItemDia példányok “lecserélése”Az InvItemDia példányok
“lecserélése”Az InvItemDia példányok “lecserélése”Az InvItemDia
példányok “lecserélése”Az InvItemDia példányok “lecserélése”Az
InvItemDia példányok “lecserélése”Az InvItemDia példányok
“lecserélése”Az InvItemDia példányok “lecserélése”Az InvItemDia
példányok “lecserélése”Az InvItemDia példányok “lecserélése”
Ügyeljen arra, hogy a paraméterek száma Ügyeljen arra, hogy a
paraméterek száma is megváltozott!!is megváltozott!!
-
40
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
A számlán A számlán megvalósítottuk az megvalósítottuk az
ellen rzött adatbevitelt.őellen rzött adatbevitelt.ő�
�
A számlántételen A számlántételen megvalósítottuk az
megvalósítottuk az
adatellen rzés.őadatellen rzés.ő
-
41
Doc/View technika: “Doc/View technika: “Doc/View technika:
“Doc/View technika: “Doc/View technika: “Doc/View technika:
“Doc/View technika: “Doc/View technika: “Doc/View technika:
“Doc/View technika: “adatátvitel”adatátvitel”
class InvoicerDoc : public QObject { . . . signals: void
documentChanged(InvoicerDoc* doc); public: const QString customer()
const { return _customer; } . . . protected: QString
_customer;};
bool InvoicerDoc::load(const QString &filename){ emit
documentChanged(this); return true;}
Hozzáveszünk egy Hozzáveszünk egy paramétert a paramétert a
documentChanged() documentChanged() szignálhoz.szignálhoz.
Azokon a helyeken, ahol Azokon a helyeken, ahol hivatkozás
történik a hivatkozás történik a
módosított függvényre, módosított függvényre, elvégezzük a
szükséges elvégezzük a szükséges
módosítást.módosítást.
invoicerdoc.h
invoicerdoc.cpp
-
42
Doc/View technika: “Doc/View technika: “Doc/View technika:
“Doc/View technika: “Doc/View technika: “Doc/View technika:
“Doc/View technika: “Doc/View technika: “Doc/View technika:
“Doc/View technika: “adat lekérése”adat lekérése”class InvoicerDoc
: public QObject { . . . signals: void documentChanged(InvoicerDoc*
doc); public: const QString customer() const { return _customer; }
. . . protected: QString _customer;};
InvoicerView::InvoicerView(QWidget *parent, InvoicerDoc *doc) :.
. . connect(doc, SIGNAL(documentChanged(InvoicerDoc*)), this,
SLOT(slotDocumentChanged(InvoicerDoc*)));. . .}. . .void
InvoicerView::slotDocumentChanged(InvoicerDoc* doc){
customer->setText( doc->customer() ); . . .}
A dokumentumra mutató pointert A dokumentumra mutató pointert a
signal/slot mechanizmust a signal/slot mechanizmust
kihasználva adjuk át a kihasználva adjuk át a
slotDocumentChanged() slotnak.slotDocumentChanged() slotnak.
A dokumentumra mutató A dokumentumra mutató pointer segítségével
pointer segítségével
lekérdezhetjük a számla lekérdezhetjük a számla (doc)
adatait.(doc) adatait.
invoicerdoc.h
invoicerview.cpp
-
43
void InvoicerView::slotDocumentChanged(InvoicerDoc* doc){
customer->setText(doc->customer());
zip->setText(doc->zip()); city->setText(doc->city());
street->setText(doc->street());
invNo->setText(doc->invNo());
released->setText(doc->released());
fulfilled->setText(doc->fulfilled());
dueTo->setText(doc->dueTo()); QListIterator it
(doc->items()); items->clear(); for (; it.current(); ++it) {
InvoiceItem *ii = it.current(); new ListViewInvoiceItem(items,ii);
}}
Az adatbeviteli mez k aktualizálásaőAz adatbeviteli mez k
aktualizálásaőAz adatbeviteli mez k aktualizálásaőAz adatbeviteli
mez k aktualizálásaőAz adatbeviteli mez k aktualizálásaőAz
adatbeviteli mez k aktualizálásaőAz adatbeviteli mez k
aktualizálásaőAz adatbeviteli mez k aktualizálásaőAz adatbeviteli
mez k aktualizálásaőAz adatbeviteli mez k aktualizálásaő
invoicerview.cpp
-
44
Fájl m veletekűFájl m veletekűFájl m veletekűFájl m veletekűFájl
m veletekűFájl m veletekűFájl m veletekűFájl m veletekűFájl m
veletekűFájl m veletekű
Fájlkezel m veletek a dokumentumban (ő ű InvoicerDoc)
newDoc: a dokumetum objektum kiürítése
save: a dokumentum objektum elmentése az aktuális fájlba
saveAs: a dokumentum objektum elmentése a megadott nev
fájlbaű
load: a dokumentum objektum beolvasása a megadott nev
fájlbólű
Fájlkezel slotok a f ablakban (ő ő InvoicerApp)
slotFileNew
slotFileSave
slotFileSaveAs
slotFileOpen
-
45
A dokumentum osztály fájlkezel őA dokumentum osztály fájlkezel
őm veleteit már el készítettük.ű őm veleteit már el készítettük.ű
ő
-
46
Ezeket a m veleteket nekünk űEzeket a m veleteket nekünk űkell
implementálni.kell implementálni.
-
47
Új adattag: Új adattag: Új adattag: Új adattag: Új adattag: Új
adattag: Új adattag: Új adattag: Új adattag: Új adattag:
_filename_filename
class InvoicerDoc : public QObject { . . . public: . . . const
QString dueTo() const { return _dueTo; } const QString fileName()
const { return _filename; } protected: . . . QString _dueTo;
QString _filename;};
A dokumentum osztályt kib vítjük egy új őA dokumentum osztályt
kib vítjük egy új őadattaggal, amelyben az aktuális számlát
adattaggal, amelyben az aktuális számlát
tartalmazó fájl nevét tároljuk.tartalmazó fájl nevét
tároljuk.
invoicerdoc.h
-
48
A A A A A A A A A A newDoc()newDoc() implementációja
implementációja implementációja implementációja implementációja
implementációja implementációja implementációja implementációja
implementációja
void InvoicerDoc::newDoc(){ _customer = _zip = _city = _street =
_invNo= _released = _fulfilled = _dueTo = ""; _items.clear();
_filename="";
modified = false;
emit documentChanged(this);}
2
3
1
Kiüríti a dokumentumot, és a Kiüríti a dokumentumot, és a
módosításról értesíti a view osztályt.módosításról értesíti a view
osztályt.
invoicerdoc.h
-
49
A A A A A A A A A A save()save() implementációja implementációja
implementációja implementációja implementációja implementációja
implementációja implementációja implementációja implementációjabool
InvoicerDoc::save() { ofstream f(_filename); if (f) { f
-
50
bool InvoicerDoc::saveAs(const QString &filename){
_filename=filename; return save();}
A A A A A A A A A A saveAs()saveAs() implementációja
implementációja implementációja implementációja implementációja
implementációja implementációja implementációja implementációja
implementációjainvoicerdoc.h
-
51
A A A A A A A A A A load()load() függvény implementációja – 1
függvény implementációja – 1 függvény implementációja – 1 függvény
implementációja – 1 függvény implementációja – 1 függvény
implementációja – 1 függvény implementációja – 1 függvény
implementációja – 1 függvény implementációja – 1 függvény
implementációja – 1
bool InvoicerDoc::load(const QString &filename) { ifstream
f; char buf[1024], buf2[1024]; f.open(filename);
if (f) { f.getline(buf,1024); _customer =
QString::fromUtf8(buf); f.getline(buf,1024); _zip =
QString::fromUtf8(buf); f.getline(buf,1024); _city =
QString::fromUtf8(buf); f.getline(buf,1024); _street =
QString::fromUtf8(buf); f.getline(buf,1024); _invNo =
QString::fromUtf8(buf); f.getline(buf,1024); _released =
QString::fromUtf8(buf); f.getline(buf,1024); _fulfilled =
QString::fromUtf8(buf); f.getline(buf,1024); _dueTo =
QString::fromUtf8(buf);. . .}
A számla-fejléc adatok A számla-fejléc adatok
beolvasásabeolvasása
invoicerdoc.cpp
Bendegúz Gyümölcsfeldolgozó Kft.1234BudapestCseresznyefa utca
13.678902004.05.062004.05.062004.05.14. . .
-
52
A A A A A A A A A A load()load() függvény implementációja – 2
függvény implementációja – 2 függvény implementációja – 2 függvény
implementációja – 2 függvény implementációja – 2 függvény
implementációja – 2 függvény implementációja – 2 függvény
implementációja – 2 függvény implementációja – 2 függvény
implementációja – 2. . . //load items _items.clear(); int ic, q, u,
v; //quantity, unit price, vat f >> ic; f.getline(buf,1024);
//skip rest of line while (ic>0) { f.getline(buf,1024); //name
f.getline(buf2,1024); //unit f >> q >> u >> v;
InvoiceItem *ii=new InvoiceItem(QString::fromUtf8(buf),
QString::fromUtf8(buf2), q, u, v); f.getline(buf,1024); //skip rest
of line _items.append(ii); --ic; } _filename=filename; emit
documentChanged(this); modified=false; return true; } return
false;}
Számlatételek Számlatételek beolvasásabeolvasása
invoicerdoc.cpp
Üzenetet küldünk a külvilág Üzenetet küldünk a külvilág számára
arról, hogy a számára arról, hogy a számla megváltozott.számla
megváltozott.
. . .2Almakg51012Körtedoboz412025
-
53
const char* InvoicerDoc::check() { if (_customer.isEmpty()) {
return "The invoice cannot be saved \n until a customer is
specified."; } if (_zip.isEmpty() || _city.isEmpty() ||
_street.isEmpty()) { return "The invoice cannot be saved \n until
the address is specified."; } if (_invNo.isEmpty()) { return "The
invoice cannot be saved \n until an invoice number is specified.";
} . . . if (_items.count() ==0) { return "The invoice cannot be
saved \n without any item added."; } return 0;}
Adatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen
rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen
rzés: őAdatellen rzés: őAdatellen rzés: ő check()check()
invoicerdoc.cpp
-
54
bool Invoicer::querySave(){ if (doc->isModified()) { int r =
QMessageBox::warning(0, "Warning", "There are unsaved changes\n
Save them?", "Save", "Discard", "Cancel"); if (r==0) { // "Save" .
. .
} else if (r==1) { // "Discard" return true; } else { //
"Cancel" return false; } }else{ return true; // Nincs változás
}}
A A A A A A A A A A querySave()querySave() pr ivát függvény pr
ivát függvény pr ivát függvény pr ivát függvény pr ivát függvény pr
ivát függvény pr ivát függvény pr ivát függvény pr ivát függvény pr
ivát függvény
Lásd következ diaőLásd következ diaő
invoicer.cpp
-
55
bool Invoicer::querySave(){ . . . if (r==0) { const char*
err=doc->check(); if (err!=0) return false; if
(doc->fileName().isEmpty()) { QString fn =
QFileDialog::getSaveFileName(0, "*.inv", this); if (!fn.isEmpty())
{ return doc->saveAs(fn); } else { return false; } } else {
return doc->save(); } }else if (r==1) { . . .}
A A A A A A A A A A querySave()querySave() pr ivát függvény -
folytatás pr ivát függvény - folytatás pr ivát függvény - folytatás
pr ivát függvény - folytatás pr ivát függvény - folytatás pr ivát
függvény - folytatás pr ivát függvény - folytatás pr ivát függvény
- folytatás pr ivát függvény - folytatás pr ivát függvény -
folytatás
Kitöltöttük a Kitöltöttük a kötelez adatokat?őkötelez
adatokat?ő
invoicerdoc.cpp
-
56
A A A A A A A A A A slotFileNew()slotFileNew() módosítása
módosítása módosítása módosítása módosítása módosítása módosítása
módosítása módosítása módosítása
void Invoicer::slotFileNew(){ if (!querySave()) return;
statusBar()->message(tr("Creating new file..."));
doc->newDoc(); setCaption(doc->fileName());
statusBar()->message(tr("Ready."));}
invoicerdoc.cpp
-
57
A A A A A A A A A A slotFileOpen()slotFileOpen() módosítása
módosítása módosítása módosítása módosítása módosítása módosítása
módosítása módosítása módosításavoid Invoicer::slotFileOpen(){ if
(!querySave()) return; statusBar()->message(tr("Opening
file..."));
QString fileName = QFileDialog::getOpenFileName(0,0,this); if
(!fileName.isEmpty()) { doc->load(fileName);
setCaption(fileName); QString message=tr("Loaded document: ") +
fileName; statusBar()->message(message, 2000); } else {
statusBar()->message(tr("Opening aborted"), 2000); }}
invoicerdoc.cpp
-
58
A A A A A A A A A A slotFileSave()slotFileSave() módosítása
módosítása módosítása módosítása módosítása módosítása módosítása
módosítása módosítása módosítása
void Invoicer::slotFileSave() { if
(doc->fileName().isEmpty()) { slotFileSaveAs(); return; }
statusBar()->message(tr("Saving file...")); const char*
err=doc->check(); if (err==0){ doc->save(); } else {
QMessageBox::information(this,"Missing information", err, 1); }
statusBar()->message(tr("Ready."));}
void Invoicer::slotFileSave() {
statusBar()->message(tr("Saving file...")); doc->save();
statusBar()->message(tr("Ready."));}
invoicerdoc.cpp
-
59
A A A A A A A A A A slotFileSaveAs()slotFileSaveAs() módosítása
módosítása módosítása módosítása módosítása módosítása módosítása
módosítása módosítása módosításavoid Invoicer::slotFileSaveAs(){
statusBar()->message(tr("Saving file under new filename..."));
QString fn = QFileDialog::getSaveFileName(0, 0, this); if
(!fn.isEmpty()) { doc->saveAs(fn); } else {
statusBar()->message(tr("Saving aborted"), 2000); }
statusBar()->message(tr("Ready."));}
const char* err=doc->check(); if (err==0) {
doc->saveAs(fn); setCaption(doc->fileName()); } else {
QMessageBox::information(this,"Missing information",err,1); }
invoicerdoc.cpp
-
60
A A A A A A A A A A slotFileQuit()slotFileQuit() módosítása
módosítása módosítása módosítása módosítása módosítása módosítása
módosítása módosítása módosítása
void Invoicer::slotFileQuit(){ if (!querySave()) return;
statusBar()->message(tr("Exiting application..."));
qApp->quit(); statusBar()->message(tr("Ready."));}
invoicerdoc.cpp
-
61
Ami (biztosan) kimaradt ...Ami (biztosan) kimaradt ...Ami
(biztosan) kimaradt ...Ami (biztosan) kimaradt ...Ami (biztosan)
kimaradt ...Ami (biztosan) kimaradt ...Ami (biztosan) kimaradt
...Ami (biztosan) kimaradt ...Ami (biztosan) kimaradt ...Ami
(biztosan) kimaradt ...
számlatételek összegzése a view sum mez jébenő
a tételm veletek engedélyezése/tiltásaű
fájlkezelési hibák figyelése
-
62
VégeVégeVégeVégeVégeVégeVégeVégeVégeVége