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



Hasonló dokumentumok
Elemi alkalmazások fejlesztése III.

Budapest, március. ELTE Informatikai Kar

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III

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

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

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

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

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

Elemi alkalmazások fejlesztése III

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

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

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

Elemi alkalmazások fejlesztése III.

Programozási technológia

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése I.

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

Elemi alkalmazások fejlesztése III.

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

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

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

Eseménykezelés. Aszinkron kommunikáció

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Programozás I. gyakorlat

3. Osztályok II. Programozás II

2. Beadandó feladat dokumentáció

Két csomag elemeiből lehet a felületet elkészíteni: awt: heavy weight komponensek; swing: light weight komponensek (időben később).

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

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

Eseményvezérelt alkalmazások

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

Bevezetés a Python programozási nyelvbe

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

Programozás BMEKOKAA146. Dr. Bécsi Tamás 8. előadás

Delphi programozás I.

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

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

1. Origin telepítése. A telepítő első képernyőjén kattintson a Next gombra:

2. Beadandó feladat dokumentáció

Bevezetés a Programozásba II 4. előadás. Adattípusok hordozhatósága

Grafikus felhasználói felületek. Dr. Szendrei Rudolf Informatikai Kar Eötvös Loránd Tudományegyetem. Programozási technológia I. Dr.

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

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

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

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

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

Programozási nyelvek Java

Eseményvezérelt alkalmazások fejlesztése I 3. előadás. Dinamikus felületű alkalmazások. Giachetta Roberto

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

Programozás C++ -ban

Hozzunk létre két rekordot a táblában, majd véglegesítsünk (commit):

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

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

Java I. A Java programozási nyelv

Mobil Informatikai Rendszerek

Objektumok inicializálása

Java és web programozás

Programozás C++ -ban 2007/7

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

Elemi alkalmazások fejlesztése IV.

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

Programozási technológia

Műveletek makrókkal. Makró futtatása párbeszédpanelről. A Színezés makró futtatása a Makró párbeszédpanelről

components : IContainer dx : int dy : int tmidőzítő : Timer toolstripseparator1 : ToolStripSeparator tsmikilépés : ToolStripMenuItem

Ugráló gomb oktatási segédlet Ugráló gomb

C++ programozási nyelv Konstruktorok-destruktorok

Bánsághi Anna 2015 Bánsághi Anna 1 of 31

C++ programozási nyelv

Már megismert fogalmak áttekintése

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Java programozási nyelv 4. rész Osztályok II.

Programozás I. 5. Előadás: Függvények

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

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

C programozási nyelv

Bevezetés a programozásba Előadás: A const

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

Bevezetés a programozásba Előadás: Fordítási egység

Választó lekérdezés létrehozása

SSL VPN KAPCSOLAT TELEPÍTÉSI ÚTMUTATÓ

Osztály és objektum fogalma

Bevezetés a programozásba előadás: Öröklődés

Osztályok. 4. gyakorlat

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

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

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

Iman 3.0 szoftverdokumentáció

Johanyák Zsolt Csaba: Grafikus felület programozása. Copyright 2008 Johanyák Zsolt Csaba

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Entity Framework alapú adatbáziselérés

munkafüzet open eseményéhez

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

Átírás:

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