62
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 Készítette: Szabóné Nacsa Rozália Steingart Ferenc C++/ Qt alapú C++/ Qt alapú SDI alkalmazás készítése SDI alkalmazás készítése III. III.

Elemi alkalmazások fejlesztése III...1 Elemi alkalmazások fejlesztése IIIElemi alkalmazások fejlesztése III Készítette: Szabóné Nacsa Rozália Steingart Ferenc C++/ Qt alapúC++

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

    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