Upload
others
View
11
Download
0
Embed Size (px)
Citation preview
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