Elemi alkalmazások fejlesztése III Ajánlott ir odalom Egy ablakos alkalmazás készítése I. C++ / Qt felhasználásával Qt dokumentáció online: www.trolltech.com lokális változat: Kdevelop help vagy /usr/share/doc... Nyomtatható változat: www.trolltech.com-ról PDF formátumban készítette: Szabóné Nacsa Rozália lektorálta: Párniczky Krisztina 1 2 A Qt assistant elindítása A Qt assistant nyitó ablaka Alt F2-vel behívjuk a parancsablakot, majd kiadjuk az assistant parancsot. 3 4
GUI alkalmazás Qt osztályokkal 6
Form osztály definíció For m osztály implementáció 1 #ifndef FORM_H #define FORM_H #include <qwidget.h> #include <qvbox.h> class QHBox; class QSpinBox; class QSlider; class QLineEdit; form.h class Form: public QVBox public: Form(QWidget *parent=0, const char *name=0); private: QHBox *hbox; QSpinBox *spinbox; QSlider *slider; QLineEdit *lineedit; ; #endif Caption QVBox QHBox QSpinBox QSlider QLineEdit 15 #include <qhbox.h> #include <qspinbox.h> #include <qslider.h> #include <qlineedit.h> #include "form.h" form.cpp Caption QVBox QHBox QSpinBox QSlider QLineEdit 16
Form osztály implementáció 2 Form::Form(QWidget *parent, const char *name) :QVBox(parent,name) setmargin(6); Caption setspacing(6); hbox = new QHBox(this); lineedit = new QLineEdit(this); hbox->setmargin(6); hbox->setspacing(6); spinbox = new QSpinBox(hbox); slider = new QSlider(Qt::Horizontal,hbox); slider->setrange(0,10); spinbox->setrange(0,10); spinbox->setvalue(5); QVBox QHBox QSpinBox QSlider QLineEdit connect(slider,signal(valuechanged(int)),spinbox,slot(setvalue(int))); connect(spinbox,signal(valuechanged(int)),slider,slot(setvalue(int))); form.cpp 17 class Form: public QVBox Q_OBJECT Saját slot kezelése - definíció public: Form(QWidget *parent=0, const char *name=0); private: QHBox *hbox; QSpinBox *spinbox; QSlider *slider; QLineEdit *lineedit; QString words[11]; void initwords(); public slots: void sayasword(int i); ; form.h A Q_OBJECT makróban vannak a moc számára a függvénydeklarációk. moc: meta object compiler Nem szabványos C++ elem. A moc készíti el a szabványos C++ kódot. 18 Saját slot kezelése implementáció 1 Saját slot kezelése implementáció 2 Form::Form(QWidget *parent, const char *name) :QVBox(parent,name) setmargin(6); setspacing(6); form.cpp void Form::sayAsWord(int i) lineedit->settext(words[i]); form.cpp connect(slider,signal(valuechanged(int)),spinbox,slot(setvalue(int))); connect(spinbox,signal(valuechanged(int)),slider,slot(setvalue(int))); connect(slider,signal(valuechanged(int)),this,slot(sayasword(int))); initwords(); spinbox->setvalue(5); A kezdőértéket a kapcsolat kiépítése után kell beállítani Saját slot void Form::initWords() words[0] = "null"; words[1] = "one"; words[10] = "ten"; 19 20
Form osztály definíció For m osztály implementáció 1 #include <qwidget.h> class QSpinBox; class QSlider; class QLineEdit; form.h class Form: public QWidget Q_OBJECT public: Form(QWidget *parent=0, const char *name=0); private: QSpinBox *spinbox; QSlider *slider; QLineEdit *lineedit; QString words[11]; void initwords(); Caption QSpinBox QSlider QLineEdit #include <qlayout.h> #include <qspinbox.h> #include <qslider.h> #include <qlineedit.h> #include "form.h" form.cpp Caption QSpinBox QSlider QLineEdit public slots: void sayasword(int i); ; 25 26 Form osztály implementáció 2 Form::Form(QWidget *parent, const char *name):qwidget(parent,name) spinbox = new QSpinBox(this); slider = new QSlider(Qt::Horizontal,this); slider->setrange(0,10); spinbox->setrange(0,10); Caption lineedit = new QLineEdit(this); form.cpp QHBoxLayout *toplayout = new QHBoxLayout; toplayout->addwidget(spinbox); toplayout->addwidget(slider); QSpinBox QSlider QVBoxLayout *mainlayout = new QVBoxLayout(this); mainlayout->addlayout(toplayout); mainlayout->addwidget(lineedit); mainlayout->setmargin(11); mainlayout->setspacing(6); QLineEdit connect(slider,signal(valuechanged(int)),spinbox,slot(setvalue(int))); connect(spinbox,signal(valuechanged(int)),slider,slot(setvalue(int))); connect(spinbox,signal(valuechanged(int)),this,slot(sayasword(int))); initwords(); spinbox->setvalue(5); 27
A.ui fájl és a generált kód Qt designer form.ui GUI alkalmazás Qt Designerrel UIC form.h 29 Írás, olvasás Olvasás Generálás #includes Eszköz (tool) Generált forráskód Felhasználó forráskódja form.cpp main.cpp 30 Szár maztatásos modulszer kezet ui.h -s modulszer kezet Qt designer form.ui Örökl ő dés Qt designer form.ui.h form.ui UIC formbase.h form.h Az alkalmazásspecifius funkciókat a form.ui.h implementációs fájlban adjuk meg. UIC form.h Írás, olvasás Olvasás Generálás #includes Eszköz (tool) Generált forráskód Felhasználó forráskódja formbase.cpp form.cpp main.cpp A formbase.h és a formbase.cpp minden módosításnál újra generálódik. Az alkalmazás specifikus funkciókat a származtatott osztályban adjuk meg. 31 Írás, olvasás Olvasás Generálás #includes Eszköz (tool) Generált forráskód Felhasználó forráskódja form.cpp main.cpp 32
A QtDesigner ablakai ProjectOverview Toolbox ObjectExplorer Properties Editor/ Signal Handlers 34
Edit/Connections <connections> <connection> form.ui <sender>slider</sender> <signal>valuechanged(int)</signal> <receiver>spinbox</receiver> <slot>setvalue(int)</slot> </connection> <connection> <sender>spinbox</sender> <signal>valuechanged(int)</signal> <receiver>slider</receiver> <slot>setvalue(int)</slot> </connection> </connections> 39
#include <qapplication.h> #include "form.h" Generált main.cpp program int main( int argc, char ** argv ) QApplication a( argc, argv ); Form w; w.show(); a.connect( &a, SIGNAL( lastwindowclosed() ), &a, SLOT( quit() ) ); return a.exec(); 45
Saját slot implementálása void Form::slotTextChanged_( const QString & s ) bool l=false; for (int i=0; i< (int) sizeof(words)/sizeof(words[0]) &&!l;i++) if(words[i]==s) l=true; slider->setvalue(i); 50 Legyen Ön is milliomos példa Szerkeszthet ő szöveg Gomb + kép LCD kijelző Gomb csoport Gomb + szöveg Radio Button 52
Szövegdoboz elhelyezése A Qt eszköztárából válasszuk ki a TextEdit eszközt 1 1 PushButton Pixmap gomb elhelyezése 2 3 2 Kattintsunk a vezérl ő elem tervezett helyére. 3 Kattintsunk a szövegdoboz tervezett helyére. 53 4 Válaszunk képet a gomb felirata helyett. 54 1 LCDNumber Számkijelz ő elhelyezése Távtartó (spacer) elhelyezése Spacer 2 Az endbutton és az LCD kijelz ő közé elhelyezhetünk egy távtartót. 55 56
Elrendezés szabályozása 2 Kattintsunk a Lay Out Vertically gombra. Layout toolbar Ezzel a gombbal lehet megszüntetni a csoportot. Jelöljük ki egyszerre mindhárom elemet. 1 A piros keret jelzi az elemek összetartozását 57 58 TextLabel Kérdés elhelyezése ButtonGroup Válasz keret elhelyezése 59 60
Radio Button Válaszok elhelyezése 1 Válaszok elhelyezése 2 61 62 A Következő gomb elhelyezése 63 64
Grid Layout A szabályos elrendezéshez kattintson a Lay Out in a Grid gombra Ne legyen elem kiválasztva. 65 #include <qapplication.h> #include "millmain.h" int main( int argc, char ** argv ) QApplication a( argc, argv ); MillMain w; w.show(); a.connect( &a, SIGNAL( lastwindowclosed() ), &a, SLOT( quit() ) ); return a.exec(); 67
Következ ő kérdés feladása - nextquestion() Válasz ellenő rzése - checkanswer() Kilépés - endbutton() Következ őkérdés feladása - nextquestion() Válasz ellenő rzése - checkanswer() Kilépés - endbutton() connect( nextbutton, SIGNAL( clicked() ), this, SLOT( nextquestion() ) ); connect( ansgroup, SIGNAL( clicked(int) ), this, SLOT( checkanswer(int) ) ); connect( endbutton, SIGNAL( clicked() ), this, SLOT( endgame() ) ); 69 70
millmain.ui.h Qt designer millmain.ui.h millmain.ui form.ui void MillMain::nextQuestion() qwarning( tr("millmain::nextquestion(): Not implemented yet" )); UIC millmain.h void MillMain::checkAnswer( int ) qwarning( tr("millmain::nextquestion(): Not implemented yet" )); Írás, olvasás Olvasás Generálás #includes Eszköz (tool) Generált forráskód Felhasználó forráskódja millmain.cpp main.cpp 73 void MillMain::endGame() qwarning( tr("millmain::nextquestion(): Not implemented yet" )); 74 Vége, de... A munkafüzet programjai letölthetők a people.inf.elte.hu/nacsa/eaf3/projects címről. 76