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