alkalmazások fejlesztése iii. qt 4 /c++ alapú grafikus ... · alkalmazások fejlesztése iii. qt...
TRANSCRIPT
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.................................................................................................................2A qmake eszköz.................................................................................................................................................2“Hello Qt” (hello)..............................................................................................................................................2Objektumok közötti kommunikáció (quit).........................................................................................................3
Fordítás/futtatás............................................................................................................................................4Grafikus felület létrehozása, vezérlők szinkronizálása „programozással” (lcd)................................................4
A Form osztály definíciója...........................................................................................................................5A Form osztály implementációja..................................................................................................................6Az alkalmazás főprogramja..........................................................................................................................7Az alkalmazás projekt fájlja.........................................................................................................................7Fordítás, futtatás...........................................................................................................................................7Memóriagazdálkodás, szülőgyermek kapcsolat..........................................................................................8
Időzítő használata (digitalclock)........................................................................................................................8DigitalClock osztály.....................................................................................................................................9Az alkalmazás főprogramja........................................................................................................................10Az alkalmazás projekt fájlja.......................................................................................................................10Fordítás, futtatás.........................................................................................................................................10
Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál....................................................11Grafikus 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...............................................................................................................................................13Az alkalmazás főprogramja........................................................................................................................13
Űrlap készítése többszörös származtatással (Qt Creator: quit3)......................................................................14Form osztály...............................................................................................................................................15Az alkalmazás főprogramja........................................................................................................................15Az 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 <QApplication>#include <QLabel>
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("<h1><i>Hello</i><font color=red> Qt!</font></h1>");
A „Hello Qt” fordítása/futtatása qmake eszközzel1. 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ő make2 fájlját.6. A make paranccsal szerkessze össze a projektet.7. Futtassa a programot. ./hello
A projekt leíró fájl tartalma:TEMPLATE = appTARGET = DEPENDPATH += .INCLUDEPATH += .
# InputSOURCES += 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 jeljelkezelé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 <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ás1. 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 <QWidget>
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 <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 ő
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 <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 projekt fá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 += .
# InputHEADERS += form.hSOURCES += 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. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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ő-gyermek kapcsolat
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 <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"
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 <QApplication>#include "digitalclock.h"
int main(int argc, char *argv[]){ QApplication app(argc, argv); DigitalClock clock; clock.show(); return app.exec();}
Az alkalmazás projekt fájlja
digitalclock projekt: digitalclock.proTEMPLATE = appTARGET = DEPENDPATH += .INCLUDEPATH += .
# InputHEADERS += digitalclock.hSOURCES += digitalclock.cpp main.cpp
Fordítás, futtatás1. 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. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
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á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. Indítsa el a Qt Creatort 2. File New → →Qt4 GUI Application OK→3. Adja meg a projekt nevét (quit2) és az útvonalat4. Next/Next5. Class name: Form, Base class: QWidget, Files: form.h, form.cpp, form.ui, main.cpp6. Next7. Finish 8. A projektből törölje ki a form.h, form.cpp, form.ui fájlokat9. File/new/Qt Designer Form Class OK Widget→ →
Class name: Form10. 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ájlt13. Az eszköztárból válassza ki a QLabel eszközt és húzza rá a felületre.
Text: Kattintson a Kilép gombra14. Az eszköztárból válassza ki a QPushButton eszközt és húzza rá a felületre.
Name: quitButton, Text: Kilép15. Elrendezés: Kattintson a labelre, majd a Ctrlet lenyomva tartva a quitButtonra. 16. Form menü/Lay out Vertically17. Form(az űrlap(!) kijelölése– Form menü/Lay out Vertically18. 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 <QtGui/QApplication> #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.proTARGET = 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 útvonalat4. Next/Next5. Class name: Form, Base class: QWidget, Files: form.h, form.cpp, form.ui, main.cpp6. Next7. Finish 8. A projektből törölje ki a form.h, form.cpp, form.ui fájlokat9. File/new/Qt Designer Form Class OK Widget→ →
Class name: Form10. More
Embedding of the UI class: Multiple inheritance11. Next/Finish12. Válassza ki a form.ui felület definiáló fájlt13. Az eszköztárból válassza ki a QLabel eszközt és húzza rá a felületre.
Text: Kattintson a Kilép gombra14. 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. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I.
15. Elrendezés: Kattintson a labelre, majd a Ctrlet lenyomva tartva a quitButtonra. 16. Form menü/Lay out Vertically17. Form(az űrlap(!) kijelölése– Form menü/Lay out Vertically18. 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 <QtGui/QApplication> #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 projekt fájlja
quit3 projekt: quit3.proTARGET = 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