16
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ások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 2: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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 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”.

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) widget1­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

ELTE Informatikai Kar 2. oldal

Page 3: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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 (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.

ELTE Informatikai Kar 3. oldal

Page 4: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 5: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 6: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 7: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 8: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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 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ő­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  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.

ELTE Informatikai Kar 8. oldal

Page 9: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 10: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 11: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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á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, 

ELTE Informatikai Kar 11. oldal

Page 12: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 13: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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 label­re, majd a Ctrl­et lenyomva tartva a quitButton­ra. 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

Page 14: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

Page 15: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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

15. Elrendezés: Kattintson a label­re, majd a Ctrl­et lenyomva tartva a quitButton­ra. 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::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(); }

ELTE Informatikai Kar 15. oldal

Page 16: Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus ... · Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás Bevezetés I. Alapértelmezésben az újonnan

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