Elemi alkalmazások fejlesztése III C++/ Qt alapú SDI alkalmazás készítése I. Készítette: Szabóné Nacsa Rozália Steingart Ferenc 1
Feladat Készítsünk egy számlakezel ő ablakos alkalmazást! Számlafejléc tartalmának megadása Számlatétel hozzáadása Számlatétel módosítása Számlatétel törlése Számla mentése fájlba Számla betöltése fájlból 2
Üres projekt létrehozása (KDevelop 3) 3
KDevelop3 ablaka 4
Az alkalmazás osztálystruktúrája QWidget QObject InvoicerViewBase InvoicerDoc InvoicerView QMainWindow Invoicer 5
Az InvoicerViewBase osztályt a Qt Designerrel készítjük el. QWidget InvoicerViewBase QObject InvoicerViewBase InvoicerDoc InvoicerView QMainWindow Invoicer 6
invoice A számla fejlécének felépítése zip customer city street header invno released fulfilled dueto 7
invoice Egy számlatétel felépítése itemname quantity netprice vat items unit unitprice vatpercent grossprice 8
Az items vezérlőelem szerkesztése QListView Megrajzoljuk a QListView vezérlőelemet, majd jobb klikk és Edit. 9
Qt designer invoicer view base.ui UIC invoicer viewbase.h invoicer viewbase.cpp 10
InvoicerDoc osztály QWidget QObject InvoicerViewBase InvoicerDoc InvoicerView QMainWindow Invoicer 11
InvoicerDoc osztály: létrehozás Project/New Class InvoicerDoc osztály beillesztése a projektbe KDevelop3 KDevelop2 12
Qt designer InvoicerDoc osztály: fájlok invoicer view base.ui invoicer doc.h UIC invoicer doc.cpp invoicer viewbase.h invoicer viewbase.cpp 13
#include <qobject.h> class InvoicerDoc : public QObject Q_OBJECT public: InvoicerDoc(); ~InvoicerDoc(); void newdoc(); bool save(); bool saveas(const QString &filename); bool load(const QString &filename); bool ismodified() const; signals: void documentchanged(); protected: bool modified; }; InvoicerDoc: definíció invoicerdoc.h 14
InvoicerDoc: konstruktor/destruktor #include "invoicerdoc.h" InvoicerDoc::InvoicerDoc() modified = false; } invoicerdoc.cpp InvoicerDoc::~InvoicerDoc() } 15
InvoicerDoc: newdoc(), save(), saveas() void InvoicerDoc::newDoc() //TODO Új dokumentum létrehozása } invoicerdoc.cpp bool InvoicerDoc::save() //TODO Dokumentum elmentése return true; } bool InvoicerDoc::saveAs(const QString & /*filename*/ ) //TODO Dokumentum elmentése más néven return true; } Ne legyen warning. 16
InvoicerDoc: load(), ismodified() bool InvoicerDoc::load(const QString & /*filename*/ ) //TODO Új dokumentum betöltése emit documentchanged(); return true; } invoicerdoc.cpp bool InvoicerDoc::isModified() const return modified; } 17
InvoicerView osztály QWidget QObject InvoicerViewBase InvoicerDoc InvoicerView QMainWindow Invoicer 18
InvoicerView osztály: létrehozás Project/New Class InvoicerView osztály beillesztése a projektbe KDevelop3 KDevelop2 19
Qt designer InvoicerView osztály: fájlok invoicer view base.ui invoicer doc.h UIC invoicer doc.cpp invoicer viewbase.h invoicer view.h invoicer viewbase.cpp Örökl ő dés invoicer view.cpp 20
InvoicerView: definíció #include "invoicerdoc.h" #include "invoicerviewbase.h" class InvoicerView : public InvoicerViewBase Q_OBJECT public: InvoicerView(QWidget *parent=0, InvoicerDoc* doc=0); ~InvoicerView(); protected slots: void slotdocumentchanged(); }; invoicerview.h Ha az adat megváltozott, a nézetet frissíteni kell. 21
InvoicerView: implementáció #include "invoicerview.h" InvoicerView::InvoicerView(QWidget *parent, InvoicerDoc *doc) : InvoicerViewBase(parent) connect(doc, SIGNAL(documentChanged()), this, SLOT(slotDocumentChanged())); } InvoicerView::~InvoicerView() } void InvoicerView::slotDocumentChanged() //TODO update the view } invoicerview.cpp 22
Az alkalmazás f ő ablakának létrehozása Mielőtt elkészítenénk az InvoicerView osztályt nézzük meg a QMainWindow szerkezetét és a felhasználói események kezelését Qt-ben. 23
QMainWindow osztály szerkezete Caption X menubar() topdock() leftdock() centralwidget() rightdock() bottomdock() statusbar() 24
A QAction osztály A felhasználói felülethez kötött tevékenységek absztrakciója. Megjelenhet menükben és eszközsoron is. Fajtái: Command action tevékenység végrehajtására szolgál amikor a tevékenységet el kell végezni activated() signalt küld Toggle action flag (opció) beállítására szolgál az opció változásakor toggled(bool) signalt küld csoportosítható (QActionGroup) 25
A QAction osztály összetev ő i text icon menu text accelerator status tip tool tip 26
QAction: filenew filenew = new QAction(tr("&New"), tr("ctrl+n"), this); filenew->seticonset(qpixmap::frommimesource("new.png")); filenew->setstatustip(tr("creates a new document")); filenew->setwhatsthis(tr("new File\n\nCreates a new document")); Üzenet a státusz sorban 27
Tevékenység és menüpont összekapcsolása QAction (filenew) filemenu=new QPopupMenu(); menubar()->insertitem(tr("&file"), filemenu); filenew->addto(filemenu); 28
Tevékenység és eszközgomb összekapcsolása QAction (filenew) filetoolbar = new QToolBar(this, "File operations"); filenew->addto(filetoolbar); Az eszköztár helye 29
Tevékenység és tevékenységkezel ő összekapcsolása QAction (filenew) activated() connect(filenew, SIGNAL(activated()), this, SLOT(slotFileNew())); 30
Invoicer osztály QWidget QObject InvoicerViewBase InvoicerDoc InvoicerView QMainWindow Invoicer 31
Invoicer osztály: létrehozás Project/New Class Invoicer osztály beillesztése a projektbe 32
Qt designer Invoicer osztály: fájlok invoicer view base.ui invoicer doc.h UIC invoicer doc.cpp invoicer.h invoicer viewbase.h invoicer viewbase.cpp Örökl ő dés invoicer view.h invoicer view.cpp invoicer.cpp 33
Invoicer: inicializáló m ű veletek initaction() Az alkalmazásban elérhet ő tevékenységeket reprezentáló QAction objektumok létrehozása Menürendszer felépítése Az eszköztár felépítése A sátuszsor inicializálása Kezdeti dokumentum (InvoicerDoc) létrehozása és inicializálása A nézet (InvoicerView) objektum létrehozása és inicializálása 34
Invoicer: Slotok slotfilenew() Új dokumentum létrehozása Dokumentum beolvasása fájlból Dokumentum mentése fájlba Dokumentum mentése fájlba más néven Kilépés Az eszköztár megjelenítése/elrejtése A státuszsor megjelenítése/elrejtése Az About ablak megjelenítése 35
Invoicer: adattagok doc Az aktuália dokumetum (InvoicerDoc) objektumra mutató pointer Az aktuális (és egyetlen) nézet (InvoicerView) objektumra mutató pointer. QPopupMenu, QToolBar QAction 36
Invoicer definíció: konstruktor #include <qmainwindow.h> #include "invoicerview.h" invoicer.h class QAction; class Invoicer : public QMainWindow Q_OBJECT public: Invoicer(QWidget *parent = 0, const char *name = 0);... A signal/slot mechanizmust használó osztályokban meg kell adni a QObject makrót. 37
Invoicer definíció: privát tagfüggvények... private: /** initializes all QActions of the application */ void initactions(); void initmenubar(); void inittoolbar(); void initstatusbar(); void initdoc(); void initview(); invoicer.h bool queryexit();... 38
Invoicer definíció: privát slotok... private slots: void slotfilenew(); void slotfileopen(); void slotfilesave(); void slotfilesaveas(); void slotfilequit(); void slotviewtoolbar(bool toggle); void slotviewstatusbar(bool toggle); void slothelpabout();... invoicer.h 39
Invoicer definíció: privát adattagok... private: invoicer.h InvoicerView *view; InvoicerDoc *doc; QPopupMenu *filemenu; QPopupMenu *viewmenu; QPopupMenu *helpmenu; QToolBar *filetoolbar; QAction *filenew; QAction *fileopen; QAction *filesave; QAction *filesaveas; QAction *filequit; QAction *viewtoolbar; QAction *viewstatusbar; QAction *helpaboutapp; }; 40
Invoicer implementáció: Header fájlok #include <qapplication.h> #include <qaction.h> #include <qmenubar.h> #include <qpopupmenu.h> #include <qtoolbar.h> #include <qstatusbar.h> #include <qwhatsthis.h> #include <qstring.h> #include <qpixmap.h> #include <qmsgbox.h> #include <qfiledialog.h> #include <qaccel.h> A Qt által használt osztályok header fájljai. invoicer.cpp #include "invoicer.h"... 41
... Invoicer::Invoicer(QWidget *parent, const char *name) :QMainWindow(parent,name) setcaption(tr("invoicer Version 1.0 ")); // call inits to invoke all other construction parts initactions(); initmenubar(); inittoolbar(); initstatusbar(); initdoc(); initview(); viewtoolbar->seton(true); viewstatusbar->seton(true); }... Invoicer implementáció: Konstruktor invoicer.cpp 42
... void Invoicer::initActions() filenew = new QAction(tr("&New"), tr("ctrl+n"), this); filenew->seticonset(qpixmap::frommimesource("new.png")); filenew->setstatustip(tr("creates a new document")); filenew->setwhatsthis(tr("new File\n\nCreates a new document")); connect(filenew, SIGNAL(activated()), this, SLOT(slotFileNew()));... viewtoolbar = new QAction(tr("Tool&bar"), 0, this); viewtoolbar->settoggleaction(true); viewtoolbar->setstatustip(tr("enables/disables the toolbar")); viewtoolbar->setwhatsthis(tr("toolbar\n\nenables/disables the toolbar")); connect(viewtoolbar, SIGNAL(toggled(bool)), this, SLOT(slotViewToolBar(bool)));... } Invoicer implementáció: initactions() invoicer.cpp 43
Invoicer implementáció: initmenubar() void Invoicer::initMenuBar() // menubar entry filemenu filemenu=new QPopupMenu(); filenew->addto(filemenu); fileopen->addto(filemenu); filemenu->insertseparator(); filesave->addto(filemenu); filesaveas->addto(filemenu); filemenu->insertseparator(); filequit->addto(filemenu);... invoicer.cpp // MENUBAR CONFIGURATION menubar()->insertitem(tr("&file"), filemenu); menubar()->insertitem(tr("&view"), viewmenu); menubar()->insertseparator(); menubar()->insertitem(tr("&help"), helpmenu); } 44
Invoicer implementáció: inittoolbar() void Invoicer::initToolBar() // TOOLBAR filetoolbar = new QToolBar(this, "file operations"); filenew->addto(filetoolbar); fileopen->addto(filetoolbar); filesave->addto(filetoolbar); filetoolbar->addseparator(); QWhatsThis::whatsThisButton(fileToolbar); invoicer.cpp } 45
Invoicer implementáció: initstatusbar() void Invoicer::initStatusBar() //STATUSBAR statusbar()->message(tr("ready."), 2000); } invoicer.cpp 46
Invoicer implementáció: initdoc(), initview() void Invoicer::initDoc() doc=new InvoicerDoc(); } invoicer.cpp void Invoicer::initView() // set the main widget here view=new InvoicerView(this, doc); setcentralwidget(view); } invoicer.cpp 47
Invoicer implementáció: queryexit() bool Invoicer::queryExit() int exit=qmessagebox::information(this, tr("quit..."), tr("do your really want to quit?"), QMessageBox::Ok QMessageBox::Cancel); if (exit==qmessagebox::ok) return true; else return false; } invoicer.cpp 48
Invoicer implementáció: slotfilenew() void Invoicer::slotFileNew() statusbar()->message(tr("creating new file...")); doc->newdoc(); statusbar()->message(tr("ready.")); } invoicer.cpp A tr() függvényt használva a kés bbiekben ő könnyebben megváltoztathatjuk a grafikus felület nyelvét. 49
Invoicer implementáció: slotfileopen() void Invoicer::slotFileOpen() statusbar()->message(tr("opening file...")); filter 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); } } dir invoicer.cpp 50
Invoicer implementáció: slotfilesave() void Invoicer::slotFileSave() statusbar()->message(tr("saving file...")); doc->save(); statusbar()->message(tr("ready.")); } invoicer.cpp 51
Invoicer implementáció: slotfilesaveas() void 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.")); } invoicer.cpp 52
Invoicer implementáció: slotfilequit() void Invoicer::slotFileQuit() statusbar()->message(tr("exiting application...")); // exits the Application if(doc->ismodified()) if(queryexit()) qapp->quit(); } else qapp->quit(); }; statusbar()->message(tr("ready.")); } invoicer.cpp 53
Invoicer implementáció: slotviewtoolbar() void Invoicer::slotViewToolBar(bool toggle) statusbar()->message(tr("toggle toolbar...")); if (toggle== false) filetoolbar->hide(); else filetoolbar->show(); statusbar()->message(tr("ready.")); } invoicer.cpp 54
Invoicer implementáció: slotviewstatusbar() void Invoicer::slotViewStatusBar(bool toggle) statusbar()->message(tr("toggle statusbar...")); if (toggle == false) statusbar()->hide(); else statusbar()->show(); statusbar()->message(tr("ready.")); } invoicer.cpp 55
Invoicer implementáció: slotviewstatusbar() void Invoicer::slotHelpAbout() QMessageBox::about(this,tr("About..."), trutf8("invoicer\nversion 1.0 \n(c) 2004 by Szabóné Nacsa Rozália")); } invoicer.cpp 56
Qt designer A f ő program: main.cpp invoicer view base.ui invoicer doc.h UIC invoicer doc.cpp invoicer.h invoicer viewbase.h invoicer viewbase.cpp Örökl ő dés invoicer view.h invoicer view.cpp invoicer.cpp main.cpp 57
main.cpp File/New/C++/main.cpp #include <qapplication.h> #include "invoicer.h" main.cpp int main(int argc, char *argv[]) QApplication app(argc, argv); Invoicer *invoicer=new Invoicer(); app.setmainwidget(invoicer); invoicer->show(); return app.exec(); } 58
Fordítás/Futtatás 59
Fordítás/Futtatás 60
Fordítás/futtatás terminál ablakban Hozzon létre a projekt számára egy könyvtárat: invoicer Hozza létre (vagy a honlapomról töltse le) az alábbi fájlokat: main.cpp, invoicer.h, invoicer.cpp, invoicerdoc.h, invoicerdoc.cpp, invoicerview.h, invoicerview.cpp, invoicerviewbase.ui. Hozza létre a projekt könyvtárában az images könyvtárat, és másolja oda az ikonok kép fájljait: new.png, open.png, save.png Nyisson meg egy terminál ablakot. Legyen a projekt könyvtárban (invoicer). Hozza létre a platformfüggetlen projekt fájlt (invoicer.pro): qmake -project 61
Fordítás/futtatás terminál ablakban ################################################################ # Automatically generated by qmake (1.06c) Sun Mar 21 17:41:49 2004 ################################################################ TEMPLATE = app INCLUDEPATH +=. # Input HEADERS += invoicer.h invoicerdoc.h invoicerview.h INTERFACES += invoicerviewbase.ui SOURCES += invoicer.cpp invoicerdoc.cpp invoicerview.cpp main.cpp IMAGES = images/new.png\ images/open.png\ images/save.png 62
Fordítás/futtatás terminál ablakban ################################################################ # Automatically generated by qmake (1.06c) Sun Mar 21 17:41:49 2004 ################################################################ TEMPLATE = app INCLUDEPATH +=. # Input HEADERS += invoicer.h invoicerdoc.h invoicerview.h INTERFACES += invoicerviewbase.ui SOURCES += invoicer.cpp invoicerdoc.cpp invoicerview.cpp main.cpp IMAGES = images/new.png\ images/open.png\ images/save.png A képek (ikonok) alkalmazása miatt az automatikusan generált projekt fájlt (invoicer.pro) ki kell egészíteni. 63
Hozza létre a platform függ ő make fájlt: qmake invoicer.pro Fordítsa/Szerkessze a programot: make Futtassa a programot:./invoicer 64
Vége az els ő résznek. 65