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

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

Elemi alkalmazások fejlesztése III.

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

Budapest, március. ELTE Informatikai Kar

Elemi alkalmazások fejlesztése III.

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

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

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás - Memóriajáték 1/2

Elemi alkalmazások fejlesztése III

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

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

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

Eseménykezelés. Aszinkron kommunikáció

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III

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

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

3. Osztályok II. Programozás II

Eseményvezérelt alkalmazások

Programozási technológia

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

Dinamikus felületű alkalmazások. Stílusok, időzítő, képek

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

Elemi alkalmazások fejlesztése III.

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

3. Beadandó feladat dokumentáció

A Java nyelv. Dialógus ablakok. Elek Tibor

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?

Elemi alkalmazások fejlesztése IV.

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

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

2. Beadandó feladat dokumentáció

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

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

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

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

Elemi alkalmazások fejlesztése I.

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

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

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

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

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

2. Beadandó feladat dokumentáció

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.

Eseménykezelés. Aszinkron kommunikáció

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

Egyszerűbb a Google keresőbe beírni a Sharepoint Designer 2007 letöltés kulcsszavakat és az első találat erre a címre mutat.

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

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

Programozási technológia

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

Feladat. Tervezés és implementálás

Elemi alkalmazások fejlesztése III

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

500. AA Megoldó Alfréd AA 500.

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

GráfRajz fejlesztői dokumentáció

munkafüzet open eseményéhez

Osztályok. 4. gyakorlat

Programozás II gyakorlat. 8. Operátor túlterhelés

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

Adatintegritás ellenőrzés Felhasználói dokumentáció verzió 2.0 Budapest, 2008.

C++ programozási nyelv Konstruktorok-destruktorok

1. Alapok. Programozás II

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

Programozás C++ -ban 2007/7

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

Hiteles elektronikus postafiók Perkapu

4. Öröklődés. Programozás II

Bevezetés a Python programozási nyelvbe

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

Programozás II gyakorlat. 4. Öröklődés

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

Szoftvertechnolo gia gyakorlat

Eseményvezérelt és objektumorientált programozás

Dropbox - online fájltárolás és megosztás

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

Vizuális és eseményvezérelt programozás , II. félév BMF NIK

Java és web programozás

Készítsen négy oldalas prezentációt az E CD bolt számára! Tervezze meg az emblémáját!

Pénzügyi algoritmusok

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

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

Entity Framework alapú adatbáziselérés

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

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

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a relá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 II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

8. gyakorlat Pointerek, dinamikus memóriakezelés

Makrók használata az Excelben - Makróhibák kezelése, biztonságos jelszavak generálása

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

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

Objektumok inicializálása

C++ programozási nyelv

Programozás I. gyakorlat

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

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

Átírás:

Tartalomjegyzék Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál...1 Saját vezérlő használata tervezőben (worldclocks)...1 DigitalClock osztály (módosítás)...2 MyForm osztály...3 Az alkalmazás főprogramja...3 Az alkalmazás projekt fájlja...4 Sok gombos vezérlő létrehozása (buttons1)...4 ButtonGroup osztály...5 Az alkalmazás főprogramja...7 Az alkalmazás projekt fájlja...7 Eseménykezelés futási időben létrehozott vezérlőknél (buttons2)...8 ButtonGroup osztály (kiegészítés)...8 Az alkalmazás főprogramja...9 Az alkalmazás projekt fájlja...9 Saját vezérlő, saját szignál (buttons3)...10 ButtonGroup osztály (kiegészítés)...11 MainForm osztály (kiegészítés)...13 Az alkalmazás főprogramja...14 Az alkalmazás projekt leíró fájlja...15 Gombcsoport felhasználói átméretezése (buttons4)...15 ConfigDialog osztály...16 MainForm osztály (kiegészítés)...17 Az alkalmazás főprogramja...18 Az alkalmazás projekt fájlja...18 Többnyelvűség biztosítása (Qt Linguist)...18 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 Tervezőeszközök, fejlesztőeszközök használata Qt alapú alkalmazásoknál Saját vezérlő használata tervezőben (worldclocks) Készítsünk egy olyan programot, amely mutatja a helyi időt a világ különböző pontjaira. 1. oldal

A korábban elkészített DigitalClock osztályt kiegészítjük egy új adattaggal (mtimezone), amely jelzi az adott DigitalClock példány időeltolódását a Greenwich Mean Time (GMT) időhöz képest, valamint az adattagot beállító függvénnyel (settimezone()). DigitalClock osztály (módosítás) worldclocks projekt: digitalclock.h (kiegészítés) class DigitalClock : public QLCDNumber Q_OBJECT public: DigitalClock(QWidget *parent = 0); void settimezone(int time) mtimezone = time; private slots: void showtime(); private: int mtimezone; ; A DigitalClock osztállyal definiált vezérlő használata Qt Creator ban ( Promote ) 1. Indítsa el a Qt Creatort 2. File/New/ 3. A felbukkanó NewForm ablakban válassza ki a Widget sablont 4. Create 5. Form kijelölése Property Editor objecname: MyForm 6. A QLCDNumber vezérlőt húzzá rá az ablakra. 7. Jelölje ki a vezérlőt, majd jobb kattintással hívja be a helyi menüt és válassza ki a Promote to Custom Widget menüpontot. 8. Adja meg a DigitalClock nevet. (Ezzel a technikával csak az ősosztály tulajdonságait tudja a Property ablakban beállítani. A későbbiekben majd megtanulunk egy olyan technikát is, ahol már a saját vezérlőnkre bevezetett tulajdonságokat is állítani lehet a Property ablakban. ) 9. Az előző pont alapján helyezze el a DigitalClock elemeket az ablakra. Típus Név Beállítások DigitalClock lcdbudapest Promote: QLCDNumber 2. oldal

Típus Név Beállítások DigitalClock lcdtokio Promote: QLCDNumber DigitalClock lcdlondon Promote: QLCDNumber DigitalClock lcdmoscow Promote: QLCDNumber DigitalClock lcdalaska Promote: QLCDNumber DigitalClock lcdnewzealand Promote: QLCDNumber 10. A Layout alkalmazásával rendezze el az ablakon az elemeket. 11. Mentse el a felületet myform.ui néven a display alkönyvtárba. MyFormosztály worldclocks projekt: myform.h #include "ui_myform.h" class MyForm : public QWidget, private Ui_MyForm Q_OBJECT public: MyForm(QWidget *parent = 0); ; worldclocks projekt: myform.cpp #include "myform.h" MyForm::MyForm(QWidget *parent) : QWidget(parent) setupui(this); lcdlondon >settimezone( 1); lcdtokio >settimezone(8); lcdmoscow >settimezone(2); lcdalaska >settimezone( 10); lcdnewzealand >settimezone(11); Az alkalmazás főprogramja worldclocks projekt: main.cpp #include <QApplication> 3. oldal

#include "myform.h" int main (int argc, char *argv[]) QApplication app(argc,argv); MyForm *form = new MyForm; form >show(); return app.exec(); Az alkalmazás projektfájlja digitalclock projekt: digitalclock.pro TEMPLATE = app TARGET = DEPENDPATH +=. INCLUDEPATH +=. # Input HEADERS += digitalclock.h myform.h FORMS += myform.ui SOURCES += digitalclock.cpp main.cpp myform.cpp Fordítsa le, majd futtassa a programot A program letölthet ő a people.inf.elte.hu/nacsa/qt4/eaf3/project/worldclocks címről. A worldclock példában az egyes városokhoz tartozó órát külön külön névvel láttuk el és az időzóna beállítása is egyedileg történt. Felmerül a kérdés, ha sok azonos vezérlővel dolgozunk nem lehetne e kényelmesebben/általánosabban kezelni azokat. A következő feladatban egy ilyen esetre adunk megoldást. Sok gombos vezérlő létrehozása (buttons1) Feladat: Készítsünk egy sok gombos vezérlőt úgy, hogy a gombok száma tervezéskor még nem ismert. (Sok gombos vezérlő futási időben történő elkészítése). Projekt neve legye: buttons1. 4. oldal

A projekt összeállításához a QtCreatort használjuk. A kész projekt a következő fájlokból áll: buttons1.pro, main.cpp, buttongroup.h, buttongroup.cpp 1. Indítsa el a Qt Creatort 2. Hozzon létre egy új, Qt4 GUI Application projektet. A projekt neve: buttons1 Class name: ButtonGroup, Base class: QWidget, Files: buttongroup.h, buttongroup.cpp, buttongroup.ui, main.cpp 3. A generált projektből törölje ki a buttongroup.h, buttongroup.cpp, buttongroup.ui fájlokat 4. Hozzuk létre a saját ButtonGroup osztályt. File/new/C++ Class Class name: ButtonGroup; Base class: Qwidget 5. A buttongroup.h, buttongroup.cpp fájl kódjait egészítsük ki az alábbiakban megadott kódok alapján. 6. Fordítás, futtatás ButtonGrouposztály buttons1 projekt: buttongroup.h #include <QWidget> #include <QList> class QPushButton; class QGridLayout; typedef QList<QPushButton*> ButtonList; //Gombok listájának típusa class ButtonGroup : public QWidget public: ButtonGroup(QWidget *parent = 0); private: void insertbuttons(int row, int col ); private: int mnumrows; int mnumcols; ButtonList buttonlist; //Gombok listája QGridLayout *buttonlayout; ; A gombokra mutató pintereket egy listában helyezzük el. Az osztály adatreprezentációjában azt is tároljuk, hogy ez a gombcsoport hány sorból és hány oszlopból áll. buttons1 projekt: buttongroup.cpp #include <QtGui/QGridLayout> #include <QtGui/QPushButton> #include <QtGui/QWidget> #include <QList> 5. oldal

#include "buttongroup.h" static const int NumRows=3; static const int NumCols=5; ButtonGroup::ButtonGroup(QWidget * parent):qwidget(parent),mnumrows(0),mnumcols(0) setwindowtitle("buttons1 projekt"); buttonlayout = new QGridLayout; setlayout(buttonlayout); insertbuttons(numrows,numcols); Beállítjuk az alkalmazás ablak fejléc címét. A gombok elhelyezkedésének kezelésére létrehozunk ag rácsos elrendezőt (QgridLayout) és jelezzük, hogy ezen osztály (űrlap) vezérlő elemeinek elrendezéséért ez az rácsos elrendező felel. void ButtonGroup::insertButtons(int row, int col ) mnumrows = row; mnumcols = col; QPushButton *button; for (int i = 0; i < row; i++) for (int j = 0; j< col; j++) button = new QPushButton( QString::number(i*col+j) + ". gomb",this ); //No destructor!!! button >setobjectname(qstring::number(i*col+j)); button >setsizepolicy( QSizePolicy( (QSizePolicy::Expanding),(QSizePolicy::Expanding))); buttonlayout >addwidget(button,i,j); //A gombokat regisztráljaz elrendezőben button >show(); buttonlist.append(button); //A gombot hozzávesszük a gombok listájához Beállítjuk az osztály sor és oszlop adattagjait. A new operátorral dinamikusan létrehozunk egy nyomógombot. Beállítjuk a nyomógomb tulajdonságait, majd megjelenítjük azt a felületen (show()). A gombra egy ideiglenes változó mutat (button), ezért mielőtt létrehoznánk a következő gombot ezt elhelyezzük a buttonlist adattagban. A szabad tárhelyen lefoglalt gombokat nem kell explicit módon felszabadítani, mert a MyForm megszűnésével annak gyerekei (ButtonGroup), a ButtonGroup megszűnésével annak gyerekei (gombok) törlődnek a szabad tárhelyről. Természetesen a szabad tárhelyen new operátorral elhelyezett, szülővel nem rendelkező, önálló objektumok felszabadításáról továbbra is nekünk kell gondoskodni. (destruktor). 6. oldal

Az alkalmazás főprogramja buttons1 projekt: main.cpp #include <QtGui/QApplication> #include "buttongroup.h" int main(int argc, char *argv[]) QApplication a(argc, argv); ButtonGroup w; w.show(); return a.exec(); Az alkalmazás projektfájlja buttons1 projekt: buttons1.pro TARGET = buttons1 TEMPLATE = app SOURCES += main.cpp \ buttongroup.cpp HEADERS += buttongroup.h FORMS += A program letölthet ő a people.inf.elte.hu/nacsa/qt4/eaf3/project/buttons1 címről. 7. oldal

Eseménykezelés futási időben létrehozott vezérlőknél (buttons2) Feladat: Az előzőekben létrehozott sok gombos vezérlő valamely gombjára kettintva egy üzenet ablakban jelezzük, hogy a gomb hányadik sorban és hányadik oszlopban található. Projekt neve: buttons2. Kiinduló projekt: buttons1. Kattintásra megjelenik, hová kattintottunk. Egészítsük ki a ButtonGroup osztályt az alábbiak szerint. ButtonGrouposztály (kiegészítés) buttons2 projekt: buttongroup.h... class ButtonGroup : public QWidget Q_OBJECT // FONTOS!!!!!... private slots: void on_button_clicked();... ; A Qt grafikus osztályaiban lehetőség van saját szignálok (üzenetek) és slotok (üzenet kezeleők) megadására. Definiáljuk az on_button_clicked() eseménykezelő függvényt. Ha az osztály tartalmaz saját szignálokat vagy szlotokat, akkor a Q_OBJECT makrót feltétlenül meg kell adni. Ennek hatására kerül be az a kód a programunkba, amely futási időben kezelni tidja ezeket a különleges függvényeket. Ha elmulasztjuk ezt a makrót akkor bár megadtuk a függvényt a fordító azt jelzi, hogy ez a függvény nem definiált. buttons2 projekt: buttongroup.cpp #include <QMessageBox> void ButtonGroup::insertButtons(int row, int col ) 8. oldal

mnumrows = row; mnumcols = col; QPushButton *button; for (int i = 0; i < row; i++) for (int j = 0; j< col; j++) button = new QPushButton( QString::number(i*col+j) + ". gomb",this ); //No destructor!!!... connect(button, SIGNAL(clicked()), this, SLOT(on_button_clicked())); A QObject osztály connect() függvényében kötjük össze az eseményt (SIGNAL) és az arra reagáló eseménykezelő föggvényt (SLOT). void ButtonGroup::on_button_clicked() int i = ((QPushButton*) sender()) >objectname().toint(); int row = i/mnumcols; int col = i%mnumcols; QMessageBox::information(this, trutf8("kattintás:"), QString("sor: %1, oszlop: %2 ").arg(row+1).arg(col+1)); Ez a függvény akkor kapja meg a vezérlést, amikor egy gombra rákattintottunk. A sender() függvény visszatérési értéke egy QObject típusú, az üzenetküldőre (esemény forrásobjektuma) mutató pointer. Tudjuk azt, hogy ez az Object jelen esetben egy gomb, így típuskényszerítéssel lekérdezhetjük a gomb tulajdonságait. A gombot azonosító értéket az objektum neve tartalmazza. A QMessageBox a Qt előregyártott osztálya. Ne feledkezzen meg ezt beilleszteni az alkalmazásba (#include <QMessageBox>). Érdekesség, hogy Qt4 ben nem a header fájlt kell megadni, hanem a használni kívánt osztály nevét. Az alkalmazás főprogramja buttons2 projekt: main.cpp Lásd buttons1 projekt. Az alkalmazás projektfájlja buttons2 projekt: buttons1.pro Lásd buttons1 projekt. Fordítsa és futtassa a programot. A program letölthet ő a people.inf.elte.hu/nacsa/qt4/eaf3/project/buttons2 címről. 9. oldal

Saját vezérlő, saját szignál (buttons3) Feladat: Helyezzük el az előzőekben létrehozott sok gombos vezérlőt egy űrlapra. Legyen a sok gombos vezérlőnek egy saját üzenete, amellyel átadja, hogy a gombjai közül mely sorban és oszlopban helyezkedik el az a gomb, amelyre rákattintottak. Kattintásra az űrlapon frissüljön a sor és oszlop érték. A program futását a Vége gombra kattintva fejezzük be. Projekt neve: buttons3. Kiinduló projekt: buttons2. A feladatot a QtCreatorral oldjuk meg. 1. Indítsa el a QtCreatort, majd töltse be az előző projektet. 2. Hozzon létre egy űrlapot: File/new/Qt Designer Form Class OK Widget Class name: MainForm More Embedding of the UI class: Multiple inheritance Next/Finish 3. Válassza ki a mainform.ui felület definiáló fájlt 4. Készítse el a grafikus felületet! 10. oldal

Típus Név Beállítások QLcdNumber lcdrow QLcdNumber lcdcol ButtonGroup buttongroup Promote: ButtonGroup QPushButton exitbutton Text: Vége QWidget MainForm Text: buttons3 projekt QLabel label1 Text: Sor: QLabel label2 Text: Oszlop: Egészítse ki a projekt fájljait az alábbiak szerint! ButtonGrouposztály (kiegészítés) buttons3 projekt: buttongroup.h class ButtonGroup : public QWidget Q_OBJECT public: ButtonGroup(QWidget *parent = 0); public: void newbuttongroup(int row, int col); private: 11. oldal

void insertbuttons(int row, int col ); void removebuttons(); private: int mnumrows; int mnumcols; ButtonList buttonlist; QGridLayout *buttonlayout; private slots: void on_button_clicked(); signals: void buttongroup_clicked(int row, int col); ; A gombcsoport vezérlőt már a tervzővel is feltehetjük az űrlapra, de ez még gombokat nem tartalmaz, hiszen azok szána futási időben derül ki. A gombok futáskori megadására bevezetjük a newbuttongroup(int row, int col) publikus függvényt. A függvény hívásakor adjuk meg a gombok számát. Ha többször egymás után meghívnánk ezt a függvényt, akkor a gombok elszaporodnának. Erre két megoldás is kínálkozik. Az egyik megoldás az lenne, hogy erre az osztályra alkalmazzuk a singleton pattern tervezési mintát, azaz, ha a lista (buttonlist) nem üres, akkor a newbuttongroup(int row, int col) ismételt meghívásakor nem csinálnánk semmit. A másik megoldás (mi ezt választotttuk), hogy ha esetleg már voltak gombok a gombcsoportban, akkor azokat onnan kivesszük. (newbuttongroup(int row, int col)). A ButtonGroup osztályt üzenetet (signal) is küld a külvilág felé, amikor rákattintanak valamely gombjára. Az űrlap más objektumai dönthetnek úgy, hogy rákapcsolódnak erre az üzenetre és használják az üzenettel együtt érkező adatot. buttons3 projekt: buttongroup.cpp Az üzenet küldés az emit kiadásával történik, melyben megadjuk a küldendő üzenetet és annak paramétereit. void ButtonGroup::on_button_clicked() int i = ((QPushButton*) sender()) >objectname().toint(); int row = i/mnumcols; int col = i%mnumcols; //QMessageBox::information(this, trutf8("kattintás:"), QString("sor: %1, oszlop: %2 ").arg(row+1).arg(col+1)); emit buttongroup_clicked(row,col); Új gombcsoport létrehozásakor a korábbi gombokat le kell szedni. Ezt azzal érjük el, hogy a lista elemein haladva rendre töröljük (delet) azokat. A QList::takeFirst() metódusa visszaadja a lista első elemére mutató 12. oldal

pointert, melyre kiadjuk a delete parancsot. Ezt mindaddig végezzük, amíg van elem a listában. void ButtonGroup::newButtonGroup(int row, int col) removebuttons(); insertbuttons(row, col); void ButtonGroup::removeButtons( ) while (!buttonlist.isempty()) delete buttonlist.takefirst(); MainFormosztály (kiegészítés) buttons3 projekt: mainform.h A tervezővel elkészített felületet ki kell egészíteni az alkalmazás speciális szolgáltatásaival. Két eseményt szeretnénk kezelni. Az egyik, amikor a felhasználó a Vége gombra kattint, a másik, ha a gombcsoport valamely gombjára. #include "ui_mainform.h" class MainForm : public QWidget, private Ui::MainForm Q_OBJECT Q_DISABLE_COPY(MainForm) public: explicit MainForm(QWidget *parent = 0); private slots: void on_exitbutton_clicked(); void my_on_buttongroup_clicked(int row, int col); ; buttons3 projekt: mainform.cpp #include "mainform.h" static const int NumRows=5; static const int NumCols=5; MainForm::MainForm(QWidget *parent) : QWidget(parent) setupui(this); buttongroup >newbuttongroup(numrows,numcols); connect(buttongroup, SIGNAL(buttonGroup_clicked(int,int)), this, SLOT(my_on_buttonGroup_clicked(int,int))); 13. oldal

Ha betartjuk a slotok elnevezésére vonatkozó névkonvenciókat, akkor a tervezőben megadott vezérlők szignálja a névkonvenciónak megfelelő slottal automatikusan össze van kapcsolva, így a connect(exitbutton, SIGNAL(clicked(int,int)), this, SLOT(on_exitButton_clicked(int,int))); parancsot nem kell megadnunk. A gombcsoport esetében más a helyzet. Ott a gomb csoport saját szignálját össze kell kötni az őt kezelő szlottal. connect(buttongroup, SIGNAL(buttonGroup_clicked(int,int)), this, SLOT(my_on_buttonGroup_clicked(int,int))); Ha élni akarunk az automatikus összekapcsolással, akkor arra is ügyelnünk kell, hogy az eseménykezelőnek ne adjunk olyan nevet, amely ütközhet az automatikus névvel. ( my_on_buttongroup_clicked()). Ez az eseménykezelő akkor kapja meg a vezérlést, amikor az ExitButton gombra kattintunk. A függvény az alkalmazás példányunkra mutató statikus (osztály szintű) qapp változó quit() metódusával zárja be az alkalmazást. A Qt érdekessége, hogy ez a mutató ténylegesen az alkalmazásunk példányára mutat, így ezen keresztül az alkalmazás számos tulajdonságát megszerezhetjük. void MainForm::on_exitButton_clicked() qapp >quit(); Ha a gombcsoport egy gombjára kattintunk, akkor az űrlap osztályban frissíteni kell megjelenített a sor és oszlop értékeket. Tekintettel arra, hogy az üzenettel együtt érkezik ez a két érték, így a függvényben az egyetlen feladat a paraméterül kapott két érték megjelenítése. void MainForm::my_on_buttonGroup_clicked(int row, int col) lcdrow >display(row+1); lcdcol >display(col+1); Az alkalmazás főprogramja buttons 3 projekt: main.cpp #include <QtGui/QApplication> #include "mainform.h" int main(int argc, char *argv[]) QApplication a(argc, argv); MainForm w; w.show(); return a.exec(); 14. oldal

Az alkalmazás projektleíró fájlja buttons3 projekt: buttons3.pro TARGET = buttons3 TEMPLATE = app SOURCES += main.cpp \ buttongroup.cpp \ mainform.cpp HEADERS += buttongroup.h \ mainform.h FORMS += mainform.ui Fordítsa és futtassa a programot. A program letölthet ő a people.inf.elte.hu/nacsa/qt4/eaf3/project/buttons3 címről. Gombcsoport felhasználói átméretezése (buttons4) Az előz ő példában futási idő ben, az objektum példányosításakor határoztuk meg, hogy hány gombot szeretnénk elhelyezni a felületen. Felmerülhet az az igény, hogy a program futása során többször is átméretezhessük a gombcsoportot. Feladat: Helyezzünk el a felületen egy Új méret gombot. A gombra kattintva egy párbeszédablakban megadhatjuk a gombcsoport új méretét. A felületen ezután az új méretezésnek megfelelően jelenjen meg a gombcsoport. Projekt neve: buttons4. Kiinduló projekt: buttons3. MainForm osztály ConfigDialog osztály 15. oldal

A feladatot a QtCreatorral oldjuk meg. 1. Indítsa el a QtCreatort, majd töltse be az előző projektet. 2. Hozzon létre egyúj dialógus ablakot: File/New/Qt Designer Form Class OK Dialog without Buttons Class name: ConfigDialog 3. Válassza ki a configdialog.ui felület definiáló fájlt 4. Készítse el a grafikus felületet! Típus Név Beállítások QLineEdit editrow QLineEdit editcol QPushButton okbutton Text: Rendben QPushButton cancelbutton Text: Mégse QLabel labelrow Text: Sorok száma: QLabel labelcol Text: Oszlopok száma: ConfigDialog osztály buttons4 projekt: configdialog.h #include <QDialog> #include "ui_configdialog.h" 16. oldal

class ConfigDialog : public QDialog, public Ui::ConfigDialog Q_OBJECT Q_DISABLE_COPY(ConfigDialog) public: explicit ConfigDialog(QWidget *parent = 0); public slots: void on_okbutton_clicked(); void on_cancelbutton_clicked(); ; buttons4 projekt: configdialog.cpp #include "configdialog.h" ConfigDialog::ConfigDialog(QWidget *parent) : QDialog(parent) setupui(this); void ConfigDialog::on_okButton_clicked() accept(); void ConfigDialog::on_cancelButton_clicked() reject(); MainFormosztály (kiegészítés) buttons4 projekt: mainform.h class MainForm : public QWidget, private Ui::MainForm Q_OBJECT Q_DISABLE_COPY(MainForm) public: explicit MainForm(QWidget *parent = 0); private slots: void on_exitbutton_clicked(); void my_on_buttongroup_clicked(int row, int col); ; void on_configbutton_clicked(); 17. oldal

buttons4 projekt: mainform.cpp void MainForm::on_configButton_clicked() int row, col; ConfigDialog dialog(this); if(dialog.exec()) row = dialog.rowedit >text().toint(); col = dialog.coledit >text().toint(); buttongroup >newbuttongroup(row,col); Az alkalmazás főprogramja buttons 4 projekt: main.cpp Lásd buttons3 projekt. Az alkalmazás projekt fájlja buttons4 projekt: buttons4.pro TARGET = buttons4 TEMPLATE = app SOURCES += main.cpp \ buttongroup.cpp \ mainform.cpp \ configdialog.cpp HEADERS += buttongroup.h \ mainform.h \ configdialog.h FORMS += mainform.ui \ configdialog.ui Többnyelvűség biztosítása (Qt Linguist) Egészítsük ki a decimális hexadecimális konvertáló programunkat oly módon, hogy a felületen magyar szöveg jelenjen meg. Ehhez a Qt Linguist programot fogjuk használni. Ahhoz, hogy az alkalmazásunk többféle nyelven is futtatható legyen Önnek az alábbiakat kell tennie: 1. Másolja át a convert projekt alábbi fájljait a convert_tr alkönyvtárba: (convertdialog.ui, convertdialog.h, convertdialog.cpp, main.cpp) 2. Készítse el a projekt leíró fájlt: qmake project 3. Módosítsa a projekt leíró fájlt (convert.pro módosítása) TEMPLATE = app TARGET = DEPENDPATH +=. INCLUDEPATH +=. 18. oldal

# Input HEADERS += convertdialog.h FORMS += convertdialog.ui SOURCES += convertdialog.cpp main.cpp TRANSLATIONS += convert_hu.ts 1. Gyűjtse ki a grafikus szöveges részeket (string) a projekt programjaiból: lupdate verbose convert_tr.pro Ez a program azokat a szövegrészeket gyűjti ki, melyeket a QString::fromUtf8("szöveg") alakban adtunk meg, azaz amelyeket a QString::fromUtf8 függvénnyel becsomagoltunk. 4. Készítse el a szótárat a Qt Linguis program segítségével. Indítsa el a programot, töltse be a convert_hu.ts fájlt és adja meg az angol szavak magyar megfelelőjét. 5. Készítse el az adott nyelv bináris fájlját: lrelease verbose convert_tr.pro 6. Futási időben (main() függvényben) beállíthatja a kívánt nyelvet. Módosítsa a main() függvényt az alábbiak szerint: #include <QApplication> #include <QTranslator> #include "convertdialog.h" int main (int argc, char *argv[]) QApplication app(argc,argv); QTranslator translator; translator.load("convert_hu"); app.installtranslator(&translator); ConvertDialog *dialog = new ConvertDialog; dialog >show(); return app.exec(); A program letölthető a people.inf.elte.hu/nacsa/qt4/eaf3/projects/convert_tr címről. 19. oldal