Tartalomjegyzék Alkalmazás készítés Qt osztályokkal...2 A qmake eszköz...2 Hello Qt (hello)...2 Objektumok közötti kommunikáció (quit)...3 Fordítás/futtatás...4 Grafikus felület létrehozása, vezérlők szinkronizálása programozással (lcd)...4 A Form osztály definíciója...5 A Form osztály implementációja...6 Az alkalmazás főprogramja...7 Az alkalmazás projekt fájlja...7 Fordítás, futtatás...7 Memóriagazdálkodás, szülő gyermek kapcsolat...8 Időzítő használata (digitalclock)...8 DigitalClock osztály...9 Az alkalmazás főprogramja...10 Az alkalmazás projekt fájlja...10 Fordítás, futtatás...10 Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál...11 Grafikus felületű alkalmazás készítése Qt Creatorral...11 Űrlap készítése aggregált adattaggal (Qt Creator: quit2)...12 Form osztály...13 Az alkalmazás főprogramja...13 Űrlap készítése többszörös származtatással (Qt Creator: quit3)...14 Form osztály...15 Az alkalmazás főprogramja...15 Az alkalmazás projekt fájlja...16 A munkafüzet programjai letölthetők a people.inf.elte.hu/nacsa/qt4/eaf3/projects/ címről. A munkafüzetben bemutatott programok készítésekor a Qt 4.3.4 verziót használtam. Készítette: Szabóné Nacsa Rozália email: nacsa@inf.elte.hu honlap: people.inf.elte.hu/nacsa Budapest, 2009. szeptember 1. oldal
Alkalmazás készítés Qt osztályokkal A Qt egy keretrendszer C++ kódú, platform független, többnyelvű alkalmazások fejlesztéséhez, amely többek között magába foglal egy a grafikus felületen megjeleníthető vezérlők használatát támogató kiterjedt osztály könyvtárat. A Qt eszközök honlapja: www.trolltech.com Cél: Ennek a modulnak az a célja, hogy megismerkedjünk a Qt néhány eszközével és azok használatával. A qmake eszköz A qmake eszköz segítségével könnyen és gyorsan összeállíthatjuk a projektünket. A qmake a fejlesztés alatt álló alkalmazás fájljai alapján automatikusan elkészíti a projektet leíró fájlt (qmake project), majd a projekt leíró fájlban található információk alapján automatikusan elkészíti a projekt összeállításához szükséges Makefile t. (qmake hello.pro). A Makefile ba automatikusan belekerülnek az adott projekt elkészítéséhez szükséges fordítási, szerkesztési funkciók. Ha nyomkövetést is szeretnénk, akkor ezt a projekt leíró fájlban külön jelezni kell (CONFIG += qt debug). Hello Qt (hello) Feladat: Készítsünk egy futtatható Hello Qt alkalmazást Qt osztályok segítségével, kézi programozással. hello.cpp #include <QApplication> #include <QLabel> A Hello Qt alkalmazás Linux alatt int main(int argc,char **argv) QApplication app(argc,argv); QLabel *label = new QLabel("Hello Qt!"); label >show(); return app.exec(); A fájl elejére beillesztjük a programban használt osztálykönyvtárat. A főprogramban (main()) először a verem tetején létrehozunk egy QApplication (alkalmazás) objektumot (app). Ez az objektum kezeli az alkalmazás erőforrásait. Ezután létrehozunk egy, a kívánt szöveget megjelenítő QLabel (címke) widget 1 et (label). Az így előkészített widget et (űrlapot, ablakot, vezérlőt) megjelenítjük a képernyőn (show()). 1 widget: a felhasználói felületen látható elem 2. oldal
Alapértelmezésben az újonnan létrehozott vezérlők nem láthatók, megjelenítésükről (show()) nekünk kell gondoskodni. Ennek oka az, hogy ha a vezérlőelemet a háttérben (memóriában) készítjük el és csak ezután jelenítjük meg, akkor elkerülhető a folyamatos frissítésből adódó villogás. A program végén meghívjuk az alkalmazás exec() metódusát. Az exec() meghívásával az alkalmazás készenléti állapotba kerül, és a neki szóló eseményekre várakozik. A futó alkalmazás folyamatosan feldolgozza a hozzá érkező eseményeket mindaddig, amíg be nem zárjuk az alkalmazás főablakát. A főablak bezárásakor minden főablakhoz rendelt vezérlő törlődik a memóriából. A QLabel konstruktorában megadott szövegre alkalmazhatjuk a HTML stílusú formázást is. QLabel *label = new QLabel("<h1><i>Hello</i><font color=red> Qt!</font></h1>"); A Hello Qt fordítása/futtatása qmake eszközzel 1. Hozza létre a hello alkönyvtárat. 2. Gépelje be a fenti programot a hello.cpp fájlba és mentse el azt a hello alkönyvtárba. 3. Legyen a hello alkönyvtárban. 4. A qmake project paranccsal állítsa elő a platform független projekt leíró fájlt (hello.pro). 5. A qmake hello.pro paranccsal állítsa elő a projekt platform függő make 2 fájlját. 6. A make paranccsal szerkessze össze a projektet. 7. Futtassa a programot../hello A projekt leíró fájl tartalma: TEMPLATE = app TARGET = DEPENDPATH +=. INCLUDEPATH +=. # Input SOURCES += hello.cpp A program letölthető a people.inf.elte.hu/nacsa/qt4/eaf3/projects/hello címről. Objektumok közötti kommunikáció (quit) A Qt vezérlő elemei (widget ek) állapotuk megváltozásakor, vagy egy rájuk vonatkozó felhasználói esemény (pl. egér kattintás) bekövetkezésekor jelet (signál, adás ) adhatnak le. Qt ben léteznek az ilyen jelek fogadására alkalmas (egyébként szabványos függvényként is meghívható) jelkezelő függvények (slot). Ha a jelet (signal) és a jelkezelő függvényeket (slot) összekapcsoljuk, az összekapcsolás után erre a jelre a jelkezelő függvények automatikusan végrahajtódnak. Az összekapcsolást a QObject osztály connect() statikus függvényével lehet megadni. Egy jelre több jelkezelő függvény is rákapcsolható. Ilyenkor a függvények végrehajtási sorrendje nem definiált. Qt ben két jelet is össze lehet kötni. Így a származtatott osztály komponenseinek üzeneteit kényelmesen tovább delegálhatjuk. Ebben a példában megmutatjuk, hogyan válaszolhatunk a felhasználó által kezdeményezett eseményre a jel jelkezelés (signal slot) mechanizmussal. Az alkalmazás egyetlen gombból áll. A gombra kattintva (felhasználói esemény) az alkalmazás ablaka bezárul (az esemény feldolgozása). Az ablakot az egyetlen alkalmazásunk 2 : A Makefile egy olyan script fájl, amely az adott projekt elemeinek lefordítását, összeszerkesztését végzi. 3. oldal
(QApplication, melyre a qapp változó mutat) quit() metódusa végzi. A főablak bezárásakor a főablak automatikusan törlődik a memóriából és eltűnik a képernyőről is. A példa nagyon hasonlít az Hello Qt programhoz, csak itt címke (QLabel) helyett gombbal (QPushButton) dolgozunk. quit.cpp A Quit alkalmazás Linux alatt #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) QApplication app(argc,argv); QPushButton *button = new QPushButton("Quit"); QObject::connect(button,SIGNAL(clicked()),&app,SLOT(quit())); button >show(); return app.exec(); A példa connect() függvényében a button widget clicked() jelzését (signal) kötöttük össze az app objektum quit() jelkezelő függvényével (slot). Figyeljük meg, hogy paraméterként a button és az app objektum címét adtuk meg Fordítás/futtatás 1. Hozza létre a quit alkönyvtárat. 2. Hozza létre a main.cpp fájlt és mentse el a quit alkönyvtárba. 3. Legyen a quit alkönyvtárban. 4. A qmake project paranccsal állítsa elő a platform független projekt leíró fájlt (quit.pro). 5. A qmake quit.pro paranccsal állítsa elő a projekt platform függő make fájlját. 6. A make paranccsal szerkessze össze a projektet. 7. Futtassa a programot. Linux:./quit A program letölthető a people.inf.elte.hu/nacsa/qt4/eaf3/mod01/projects/quit címről. Grafikus felület létrehozása, vezérlők szinkronizálása programozással (lcd) Feladat: Készítsük el azt az alkalmazást, amely egy számlálót, egy csúszkát és egy LCD kijelzőt tartalmaz. Ha bármelyiken beállítunk egy értéket, a többi vezérlő automatikusan mutassa a beállított értéket. 4. oldal
Először elkészítjük a grafikus felületet reprezentáló Form osztályt. A főprogramban (main()) létrehozzuk a Form osztály egy példányát, melyet megjelenítünk a képernyőn (show()), majd elindítjuk az alkalmazást (exec()). A főablakot a QWidget osztályból származtatjuk. A főablakon elhelyezzük a QSpinBox (spinbox), QSlider (slider) és a QLCDNumber (lcd) vezérlőket. Az alkalmazás modulszerkezete Az alkalmazás felületterve A felületen elhelyezett elemek Típus Név Beállítások QSpinBox spinbox minvalue = 0, maxvalue = 10 QSlider slider minvalue = 0, maxvalue = 10 QLCDNUmber lcd A Form osztály definíciója lcd projekt: form.h #ifndef _FORM_H_ #define _FORM_H_ #include <QWidget> class QSpinBox; 5. oldal
class QSlider; class QLCDNumber; class Form: public QWidget Q_OBJECT public: Form(QWidget *parent=0); private: QSpinBox *spinbox; QSlider *slider; QLCDNumber *lcd; ; #endif //_FORM_H_ A Form osztály implementációja lcd projekt: form.cpp #include <QLayout> #include <QSpinBox> #include <QSlider> #include <QLCDNumber> #include "form.h" Form::Form(QWidget *parent) : QWidget(parent) spinbox = new QspinBox; //számláló létrehozása és paraméterezése setobjectname(qstring::fromutf8("spinbox")); spinbox >setrange(0,10); spinbox >setmaximum(1000); slider = new Qslider(Qt::Horizontal); //csúszka létrehozása és paraméterezése setobjectname(qstring::fromutf8("slider")); slider >setrange(0,10); slider >setmaximum(1000); slider >setsinglestep(100); slider >setorientation(qt::horizontal); slider >settickposition(qslider::ticksbelow); lcd = new QLCDNumber; //LCD kijelz ő létrehozása és paraméterezése setobjectname(qstring::fromutf8("lcd")); QHBoxLayout *toplayout = new QHBoxLayout; //Egy vízszintes rendezőbe beletesszük toplayout >addwidget(spinbox); //a számlálót toplayout >addwidget(slider); // és a csúszkát QVBoxLayout *mainlayout = new QVBoxLayout; //A főablak rendezője egy függöleges doboz mainlayout >addlayout(toplayout); //A főablak rendezőjébe beletesszük a vízszintes rendezőt mainlayout >addwidget(lcd); // és az LCD kijelzőt 6. oldal
mainlayout >setmargin(11); mainlayout >setspacing(6); setlayout(mainlayout); //A setlayout hatására minden benne lév ő elemnek ez a Form lesz a szülője! connect(spinbox, SIGNAL(valueChanged(int)), lcd, SLOT(display(int))); connect(spinbox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); connect(slider, SIGNAL(sliderMoved(int)), lcd, SLOT(display(int))); connect(slider, SIGNAL(valueChanged(int)), spinbox, SLOT(setValue(int))); Ha a számláló értéke megváltozott, akkor a kijelz ő jelenítse meg a megváltozott értéket. Ha a számláló értéke megváltozott, akkor a csúszka vegye fel a megváltozott értéket. Ebben a programban a connect() függvényhívásnál azért nem kell megadni, hogy ez a függvény a QObject osztály metódusa, mert az űrlapukat a QWidget osztályból származtattuk és a connect() függvény a QObject osztály függvénye, amely a QWidget osztály őse, így a fordító anélkül is megtalálja ezt a függvényt. Az események kezelésére az adott objektum előredefiniált eseménykezelő függvényeit használjuk. Az alkalmazás főprogramja lcd projekt: form.cpp #include <QApplication> #include "form.h" int main(int argc, char *argv[]) QApplication app(argc,argv); Form *form = new Form; form >show(); return app.exec(); Az alkalmazás projektfájlja Nézzük meg a qmake eszközzel generált projekt leíró fájlt. lcd projekt: lcd.pro TEMPLATE = app TARGET = DEPENDPATH +=. INCLUDEPATH +=. # Input HEADERS += form.h SOURCES += form.cpp main.cpp Fordítás, futtatás 1. Hozza létre az lcd alkönyvtárat. 2. Hozza létre a form.h, form.cpp, main.cpp fájlokat és tárolja azokat a lcd alkönyvtárban. 7. oldal
3. Legyen a lcd alkönyvtárban. 4. A qmake project paranccsal állítsa elő a platform független projekt leíró fájlt (lcd.pro). 5. A qmake o Makefile nlcd.pro paranccsal állítsa elő a projekt platform függő make fájlját. 6. A make paranccsal szerkessze össze a projektet. 7. Futtassa a programot. A program letölthető a people.inf.elte.hu/nacsa/qt4/eaf3/projects/lcd címről. Memóriagazdálkodás,szülő-gyermekkapcsolat Ha megnézzük a programunkat, akkor azt látjuk, hogy számos helyen használjuk a new operátort, és sehol sem szabadítottuk fel az így lefoglalt tárhelyet. Grafikus alkalmazások készítésekor nagyon sok elemet (widget) kell kezelni. Ezeket általában a szabad tárterületen (heap), new operátorral hozzuk létre. Az eddigi ismereteink szerint a new operátorral lefoglalt tárhelyet fel kell szabadítani. A vezérlők használat utáni megsemmisítését és az általuk elfoglalt tárhely felszabadítását segíti a Qt szülő gyermek mechanizmusa, melynek lényege a következő: Ha egy widget et törlünk, akkor törlésre kerül annak valamennyi gyermeke. Törölt widget eltűnik a képernyőről. A főablakként kezelt widget bezárásnál törlődik. Így nekünk csak olyan widget ek törléséről kell gondoskodnunk, amelyeket new operátorral hoztunk létre, és nem volt szülője. Az alábbi ábra az lcd program szülő gyermek 3 kapcsolatát mutatja. A Form osztály implementációjában található setlayout(mainlayout) függvényhívás hatására a vezérlők szülő gyermek kapcsolata úgy épül fel, hogy a mainlayout hoz rendelt valamennyi vezérlőnek a Form osztály lesz a szülője, így a Form ablak bezárásakor valamennyi általunk létrehozott vezérlő számára lefoglalt tárhely felszabadul. Időzítő használata (digitalclock) A Qt osztályai között vannak olyanok is, melyeken a felhasználó közreműködése nélkül következhetnek be események és ezekről jelzést is küldhetnek. Ilyen pl. a QTimer osztály, amely egy adott idő elteltével, vagy adott időközönként jelezni tud. A timer (időzítő) használatára mutatunk példát az alábbi digitalclock példában. 3 A szülő gyermek kapcsolat és az öröklődés nem azonos fogalmak. 8. oldal
Feladat: Készítsünk digitális órát. A DigitalClock típust nekünk kell megvalósítani. A program modulszerkezete a következő: A DigitalClock osztályunkat a QLCDNumber osztályból, származtatással készítjük el.. DigitalClock osztály digitalclock projekt: digitalclock.h #ifndef _DIGITAL_CLOCK_H_ #define _DIGITAL_CLOCK_H_ #include <QLCDNumber> class DigitalClock : public QLCDNumber Q_OBJECT public: DigitalClock(QWidget *parent = 0); private slots: void showtime(); ; #endif //_DIGITAL_CLOCK_H_ digitalclock projekt: digitalclock.cpp #include <QTimer> #include <QDateTime> #include "digitalclock.h" 9. oldal
DigitalClock::DigitalClock(QWidget *parent) : QLCDNumber(parent) setsegmentstyle(filled); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(showTime())); timer >start(1000); showtime(); setwindowtitle(tr("digital Clock")); resize(150, 60); void DigitalClock::showTime() QTime time = QTime::currentTime(); QString text = time.tostring("hh:mm"); if ((time.second() % 2) == 0) text[2] = ' '; display(text); Az alkalmazás főprogramja digitalclock projekt: main.cpp #include <QApplication> #include "digitalclock.h" int main(int argc, char *argv[]) QApplication app(argc, argv); DigitalClock clock; clock.show(); return app.exec(); Az alkalmazás projektfájlja digitalclock projekt: digitalclock.pro TEMPLATE = app TARGET = DEPENDPATH +=. INCLUDEPATH +=. # Input HEADERS += digitalclock.h SOURCES += digitalclock.cpp main.cpp Fordítás, futtatás 1. Hozza létre az digitalclock alkönyvtárat. 2. Gépelje be a digitalclock.h, digitalclock.cpp, main.cpp fájlokat és mentse el a digitalclock alkönyvtárban. 10. oldal
3. Legyen a digitalclock alkönyvtárban. 4. A qmake project paranccsal állítsa elő a platform független projekt leíró fájlt (digitalclock.pro). 5. A qmake o Makefile digitalclock.pro paranccsal állítsa elő a projekt platform függő make fájlját. 6. A make paranccsal szerkessze össze a projektet. 7. Futtassa a programot. A program letölthető a people.inf.elte.hu/nacsa/qt4/eaf3//projects/digitalclock címről. Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál A Qt osztályait használó alkalmazások elkészítésére számos felület tervező eszköz és integrált fejlesztő eszköz áll rendelkezésünkre. A Qt Designer a felület megtervezésében nyújt segítséget. A projekt összeállítását, fordítását, futtatását a programozó saját kezűleg végzi. Ezek az eszközök alkalmasak az objektumok közötti üzenetek átadásának, fogadásának megtervezésére is. A Qt Creator a felület megtervezése mellett támogatja a projekt összeállítását, fordítását, futtatását, esetenként kódkiegészítéssel teszi hatékonyabbá a program elkészítését. Ha valamilyen eszközt használunk a felület megtervezésére, mindig ott van az a kérdés, hogy a megtervezett felületből milyen kód keletkezik, illetve az így generált forráskódot hogyan bővíthetjük az igényeinknek megfelelően. A felületből generált udvarias kód arra is figyel, hogy megfeleljen a programozó által előnyben részesített programozási stílusnak. Grafikus felületű alkalmazás készítése Qt Creatorral A Qt Creator grafikus felületek tervezését támogató vizuális eszköz. A Qt eszközök alkalmazásakor a felület megtervezése után a felülethez készített osztályt használva adhatjuk meg a felület alkalmazás specifikus funkcióit. Nézzük meg, hogyan készül el a Qt Creatorral megtervezett felület osztály kódja. A tervező kimenete egy.ui kiterjesztésű fájl. Ha szövegszerkesztővel megnézzük a form.ui kiterjesztésű fájlt, 11. oldal
akkor azt látjuk, hogy ez egy egyszerű szöveges fájl, amely a grafikus felület definícióját tartalmazza. Az alkalmazás összeállításakor a felületet definiáló.ui fájlból egy speciális program, az uic (user interface compiler) segítségével készül el a felületet reprezentáló Ui_Form osztály C++ kódja, amely az ui_form.h fájlba kerül. Az így elkészült felület osztályt a tovább csinosíthatjuk, ha felhasználjuk azt akár adattagként, akár többszörös származtatással. GUI osztály hasznosítása adattagként GUI osztály hasznosítása többszörös öröklődéssel Űrlap készítése aggregált adattaggal (Qt Creator: quit2) Feladat: Készítsük el azt a programot, amely egyetlen gombot tartalmaz (quit) és egyetlen funkciója, hogy a gombra kattintva az alkalmazás bezárul. A projektet a Qt Creator segítségével állítjuk elő úgy, hogy a GUI osztályt aggregált adattagként hasznosítjuk. A Projekt neve: quit2 Grafikus felület megtervezése 1. Indítsa el a Qt Creatort 2. File New Qt4 GUI Application OK 3. Adja meg a projekt nevét (quit2) és az útvonalat 4. Next/Next 5. Class name: Form, Base class: QWidget, Files: form.h, form.cpp, form.ui, main.cpp 6. Next 7. Finish 8. A projektből törölje ki a form.h, form.cpp, form.ui fájlokat 9. File/new/Qt Designer Form Class OK Widget Class name: Form 10. More Embedding of the UI class: Aggregation (!!) 11. Next/Finish 12. oldal
Form osztály quit2 projekt: form.h 12. Válassza ki a form.ui felület definiáló fájlt 13. Az eszköztárból válassza ki a QLabel eszközt és húzza rá a felületre. Text: Kattintson a Kilép gombra 14. Az eszköztárból válassza ki a QPushButton eszközt és húzza rá a felületre. Name: quitbutton, Text: Kilép 15. Elrendezés: Kattintson a label re, majd a Ctrl et lenyomva tartva a quitbutton ra. 16. Form menü/lay out Vertically 17. Form(az űrlap(!) kijelölése Form menü/lay out Vertically 18. Fordítás, szerkesztés #include "ui_form.h" class Form : public QWidget Q_OBJECT Q_DISABLE_COPY(Form) public: explicit Form(QWidget *parent = 0); private: Ui::Form m_ui; private slots: void on_quitbutton_clicked(); ; A Form osztály m_ui adat tagja a tervezett felület. Ha ezt a megoldást választjuk, akkor az implementációban a felületre és annak összetevőire az m_ui változón keresztül hivatkozhatunk. quit2 projekt: form.cpp #include "form.h" Form::Form(QWidget *parent) : m_ui.setupui(this); QWidget(parent) A tervezővel elkészített felület kialakítása és a rajta lévő elemek inicializálása a setupui() függvény meghívásakor történik meg. Vegyük észre, hogy az aggregáció miatt csak az m_ui változón keresztül hivatkozhatunk a függvényre. void Form::on_quitButton_clicked() qapp >quit(); Az alkalmazás főprogramja quit2 projekt: main.cpp #include <QtGui/QApplication> #include "form.h" 13. oldal
int main(int argc, char *argv[]) QApplication a(argc, argv); Form w; w.show(); return a.exec(); Az alkalmazás projekt fájlja quit2 projekt: quit2.pro TARGET = quit2 TEMPLATE = app SOURCES += main.cpp \ form.cpp HEADERS += form.h FORMS += form.ui A program letölthető a people.inf.elte.hu/nacsa/qt4/eaf3/projects/quit2 címről. Pillantson be az uic által generált ui_form.h fájlba. Nézze meg, milyen kódot generált az uic. A Qt Creator azt is lehetővé teszi, hogy a Form osztályt a felület osztályból és egy QWidget osztályból származtatva (többszörös származtatás) állítsuk elő. Űrlap készítése többszörös származtatással (Qt Creator: quit3) Feladat: Készítsük el quit projektünket Qt Creator segítségével úgy, hogy a GUI osztályt többszörös származtatással illesztjük be. Projekt neve legye: quit3 Grafikus felület megtervezése 1. Indítsa el a Qt Creatort 2. File New Qt4 GUI Application OK 3. Adja meg a projekt nevét (quit2) és az útvonalat 4. Next/Next 5. Class name: Form, Base class: QWidget, Files: form.h, form.cpp, form.ui, main.cpp 6. Next 7. Finish 8. A projektből törölje ki a form.h, form.cpp, form.ui fájlokat 9. File/new/Qt Designer Form Class OK Widget Class name: Form 10. More Embedding of the UI class: Multiple inheritance 11. Next/Finish 12. Válassza ki a form.ui felület definiáló fájlt 13. Az eszköztárból válassza ki a QLabel eszközt és húzza rá a felületre. Text: Kattintson a Kilép gombra 14. Az eszköztárból válassza ki a QPushButton eszközt és húzza rá a felületre. Name: quitbutton, Text: Kilép 14. oldal
Form osztály quit3 projekt: form.h #include "ui_form.h" 15. Elrendezés: Kattintson a label re, majd a Ctrl et lenyomva tartva a quitbutton ra. 16. Form menü/lay out Vertically 17. Form(az űrlap(!) kijelölése Form menü/lay out Vertically 18. Fordítás, szerkesztés class Form : public QWidget, private Ui::Form Q_OBJECT Q_DISABLE_COPY(Form) public: explicit Form(QWidget *parent = 0); private slots: void on_quitbutton_clicked(); ; Ebben az esetben az Ui::Form ból és a QWidget osztályból (mindkettőből!) állítjuk elő saját Form osztályunkat. quit3 projekt: form.cpp #include "form.h" Form::Form(QWidget *parent) : QWidget(parent) setupui(this); void Form::on_quitButton_clicked() qapp >quit(); Az alkalmazás főprogramja quit3 projekt: main.cpp #include <QtGui/QApplication> #include "form.h" int main(int argc, char *argv[]) QApplication a(argc, argv); Form w; w.show(); return a.exec(); 15. oldal
Az alkalmazás projektfájlja quit3 projekt: quit3.pro TARGET = quit3 TEMPLATE = app SOURCES += main.cpp \ form.cpp HEADERS += form.h FORMS += form.ui A program letölthető a people.inf.elte.hu/nacsa/qt4/eaf3/projects/quit3 címről. 16. oldal