Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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:
[email protected] honlap: people.inf.elte.hu/nacsa
Budapest, 2009. szeptember
ELTE Informatikai Kar
1. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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 Makefilet. (qmake hello.pro). A Makefileba 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”.
A “Hello Qt” alkalmazás Linux alatt
hello.cpp #include
#include 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) widget1et (label). Az így előkészített widgetet (űrlapot, ablakot, vezérlőt) megjelenítjük a képernyőn (show()). 1 widget: a felhasználói felületen látható elem ELTE Informatikai Kar
2. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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("Hello Qt!
");
A „Hello Qt” fordítása/futtatása qmake eszközzel 1. 2. 3. 4. 5. 6. 7.
Hozza létre a hello alkönyvtárat. Gépelje be a fenti programot a hello.cpp fájlba és mentse el azt a hello alkönyvtárba. Legyen a hello alkönyvtárban. A qmake project paranccsal állítsa elő a platform független projekt leíró fájlt (hello.pro). A qmake hello.pro paranccsal állítsa elő a projekt platform függő make2 fájlját. A make paranccsal szerkessze össze a projektet. 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 (widgetek) á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. Qtben 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. Qtben 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 (signalslot) 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.
ELTE Informatikai Kar
3. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
(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.
A “Quit” alkalmazás Linux alatt
quit.cpp #include #include 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.
ELTE Informatikai Kar
4. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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 class QSpinBox;
ELTE Informatikai Kar
5. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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 #include #include #include #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
ELTE Informatikai Kar
6. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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 #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. ELTE Informatikai Kar
7. oldal
Alkalmazások fejlesztése III. 3. 4. 5. 6. 7.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
Legyen a lcd alkönyvtárban. A qmake project paranccsal állítsa elő a platform független projekt leíró fájlt (lcd.pro). A qmake o Makefile nlcd.pro paranccsal állítsa elő a projekt platform függő make fájlját. A make paranccsal szerkessze össze a projektet. 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 widgetet 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 widgetek 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őgyermek3” 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 mainLayouthoz 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.
ELTE Informatikai Kar
8. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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 class DigitalClock : public QLCDNumber { Q_OBJECT public: DigitalClock(QWidget *parent = 0); private slots: void showTime(); }; #endif //_DIGITAL_CLOCK_H_
digitalclock projekt: digitalclock.cpp #include #include #include "digitalclock.h"
ELTE Informatikai Kar
9. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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 #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. ELTE Informatikai Kar
10. oldal
Alkalmazások fejlesztése III. 3. 4. 5. 6. 7.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
Legyen a digitalclock alkönyvtárban. A qmake project paranccsal állítsa elő a platform független projekt leíró fájlt (digitalclock.pro). A qmake o Makefile digitalclock.pro paranccsal állítsa elő a projekt platform függő make fájlját. A make paranccsal szerkessze össze a projektet. 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ásspecifikus 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,
ELTE Informatikai Kar
11. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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. 2. 3. 4. 5. 6. 7. 8. 9.
Indítsa el a Qt Creatort File → New → Qt4 GUI Application → OK Adja meg a projekt nevét (quit2) és az útvonalat Next/Next Class name: Form, Base class: QWidget, Files: form.h, form.cpp, form.ui, main.cpp Next Finish A projektből törölje ki a form.h, form.cpp, form.ui fájlokat File/new/Qt Designer Form Class → OK → Widget Class name: Form 10. More Embedding of the UI class: Aggregation (!!) 11. Next/Finish ELTE Informatikai Kar
12. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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 labelre, majd a Ctrlet lenyomva tartva a quitButtonra. 16. Form menü/Lay out Vertically 17. Form(az űrlap(!) kijelölése– Form menü/Lay out Vertically 18. Fordítás, szerkesztés Form osztály
quit2 projekt: form.h #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) : QWidget(parent){ m_ui.setupUi(this); }
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 #include "form.h"
ELTE Informatikai Kar
13. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Indítsa el a Qt Creatort File→ New → Qt4 GUI Application → OK Adja meg a projekt nevét (quit2) és az útvonalat Next/Next Class name: Form, Base class: QWidget, Files: form.h, form.cpp, form.ui, main.cpp Next Finish A projektből törölje ki a form.h, form.cpp, form.ui fájlokat File/new/Qt Designer Form Class → OK → Widget Class name: Form More Embedding of the UI class: Multiple inheritance Next/Finish Válassza ki a form.ui felület definiáló fájlt 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 Az eszköztárból válassza ki a QPushButton eszközt és húzza rá a felületre. Name: quitButton, Text: Kilép
ELTE Informatikai Kar
14. oldal
Alkalmazások fejlesztése III. 15. 16. 17. 18.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
Elrendezés: Kattintson a labelre, majd a Ctrlet lenyomva tartva a quitButtonra. Form menü/Lay out Vertically Form(az űrlap(!) kijelölése– Form menü/Lay out Vertically Fordítás, szerkesztés
Form osztály
quit3 projekt: form.h #include "ui_form.h" 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::Formbó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 #include "form.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Form w; w.show(); return a.exec(); }
ELTE Informatikai Kar
15. oldal
Alkalmazások fejlesztése III.
Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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.
ELTE Informatikai Kar
16. oldal