Elemi alkalmazások fejlesztése III

Hasonló dokumentumok
Elemi alkalmazások fejlesztése III

Elemi alkalmazások fejlesztése III. SDI alkalmazás készítése Qt-ben I.

C++/Qt alapú SDI alkalmazás készítése II...2

ELTE Informatikai Kar

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése IV. Adatbáziskezelő alkalmazás készítése C++/Qt ben I.

Elemi alkalmazások fejlesztése III

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 3/3

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III

Elemi alkalmazások fejlesztése III

Elemi alkalmazások fejlesztése III. A Qt assistant elindítása. Ajánlott ir odalom. A Qt assistant nyitó ablaka

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.

Elemi alkalmazások fejlesztése III.

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

Elemi alkalmazások fejlesztése IV.

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

3D-s számítógépes geometria és alakzatrekonstrukció

Elemi alkalmazások fejlesztése III.

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Elemi alkalmazások fejlesztése III

Budapest, március. ELTE Informatikai Kar

QLabel *label = new Qlabel("Hello Qt!",0);

A slotfilequit() módosítása...18 Ami még hátra van...18 Projekt összeállítása Qt parancsokkal...19

Grafikus Qt programok írása segédeszközök nélkül

SDI ALKALMAZÁS I. Workspace / ResourceView / Toolbar / IDR_MAINFRAME. Workspace / ResourceView / Menu / IDR_MAINFRAME

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 2/3

Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál. Saját vezérlő használata tervezőben (worldclocks)

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 1/3

Adatbázis-kezelés ODBC driverrel

Programozás II gyakorlat. 4. Öröklődés

Elemi alkalmazások fejlesztése IV. Adatbáziskezel alkalmazás készítése QtDesignerben. Készítette: Szabóné Nacsa Rozália

Szabóné Nacsa Rozália. Feladat. Készítsünk el egy üres FormView alapú alkalmazást és építsünk köré egy súgó környezetet.

Qt rajzolás munkafüzet. Elemi Alkalmazások fejlesztése 3.

3D-s számítógépes geometria és alakzatrekonstrukció

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

Adatbázis-kezelés API hívásokkal. Adatbázis-kezelés ODBC-vel. Adatbázis-kezelés SQL parancsokkal. Adatbázis-kezelés ODBC-vel.

A jobboldalon a pnlright egy Stacked Widget Állítsuk be az első lapot és nevezzük el pnldraw-ra:

Feladat. Tervezés és implementálás

Elemi alkalmazások fejlesztése I.

Adatbázis-kezelés ODBC-vel

3. Osztályok II. Programozás II

Elemi alkalmazások fejlesztése III.

4. Öröklődés. Programozás II

ISA szimulátor objektum-orientált modell (C++)

Eseménykezelés. Aszinkron kommunikáció

Access adatbázis elérése OLE DB-n keresztül

Eseményvezérelt alkalmazások fejlesztése I 6. előadás. Összetett alkalmazások megvalósítása. Giachetta Roberto

Programozás C++ -ban

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Összetett grafikus felületű alkalmazások. Giachetta Roberto

Grafikus Felhasználói Felületű (GUI) program készítése a QT Creatorral, illetve a Microsoft Visual Studio-val

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

117. AA Megoldó Alfréd AA 117.

Eseményvezérelt alkalmazások

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Mobil informatika gyakorlat. 2. óra: NFC a gyakorlatban

Java Programozás 11. Ea: MVC modell

A Java nyelv. Dialógus ablakok. Elek Tibor

Adatbázis-kezelés ActiveX vezérl kkel

C#, OOP. Osztályok tervezése C#-ban

Programozási technológia

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Objektumok inicializálása

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Johanyák Zsolt Csaba: Ugráló gomb oktatási segédlet Copyright 2008 Johanyák Zsolt Csaba

Hálózati alkalmazások

Felhasználó által definiált adattípus

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás II. 4. Dr. Iványi Péter

Mobil alkalmazások fejlesztése

1. Alapok. Programozás II

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Virtuális függvények (late binding)

Swing GUI készítése NetBeans IDE segítségével

C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat

Mobil Informatikai Rendszerek

Java programozási nyelv 5. rész Osztályok III.

Java és web programozás

Osztály és objektum fogalma

C++ programozási nyelv Konstruktorok-destruktorok

ADATBÁZISKEZELÉS KÖZVETLEN ELÉRÉSSEL II...2

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás - Memóriajáték 1/2

Java Programozás 5. Gy: Java alapok. Adatkezelő 1.rész

Programozás C++ -ban 2007/4

libgdx alapok, első alkalmazás

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

bool _freehand = false; QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató

Származtatási mechanizmus a C++ nyelvben

Adatbázis-kezelés ActiveX vezérl kkel 2.rész

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Átírás:

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