Elemi alkalmazások fejlesztése IV. Adatbáziskezel ő alkalmazás készítése QtDesignerben Készítette: Szabóné Nacsa Rozália 1
Származtatásos modulszerkezet Q t form.ui U formbase.h Örökl ő dés form.h formbase.cpp form.cpp main.cpp Írás, olvasás Olvasás Generálás #includes Eszköz (tool) Generált forráskód Felhasználó forráskódja A formbase.h és a formbase.cpp minden módosításnál újra generálódik. Az alkalmazásspecifikus funkciókat a származtatott osztályban adjuk meg. 2
Származtatásos modulszerkezet Q t form.ui U formbase.h Örökl ő dés form.h saját formbase.cpp form.cpp main.cpp Írás, olvasás Olvasás Generálás #includes Eszköz (tool) Generált forráskód Felhasználó forráskódja saját Kiküszöbölhetnénk az öröklődést, ha úgy tudnánk beleírni a formbase.h és formbase.cpp fájlokba, hogy a generálás a kiegészítést nem rontaná el. 3
ui.h -s modulszerkezet form.ui.h Qt designer form.ui Az alkalmazásspecifius funkciókat a form.ui.h implementációs fájlban adjuk meg. U 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 form.cpp main.cpp 4
A QtDesigner ablakai ProjectOverview Toolbox ObjectExplorer Properties Editor/ Signal Handlers 5
Feladat Új csoportok felvétele, bejegyzett csoportok módosítása, törlése. 6
Feladat a megvalósítás lépései 1 2 Új csoportok felvétele, bejegyzett csoportok módosítása, törlése. F ablak + félév tábla létrehozása ő Csoport tábla elkészítése Gombok hozzáadása, dialógus elkészítése 3 7
FelevDataTable (QDataTable) primeinsert() beforeupdate() currentchanged() beforeinsert() A CsoportRegistrationForm osztálydiagramja CsoportRegistrationForm (QDialog) EditCsoportForm (QDialog) CsoportDataTable (QDataTable) primeinsert() cursorchanged() EditPushButton (QPushButton) clicked() QuitPushButton (QPushButton) clicked() 8
Új projekt létrehozása: File/New/C++ Project 9
Project Overview: csopreg.pro 10
Project/Database connections... 1 4 2 3 5 11
Projekt és adatbázis leíró tárolása A projektet leíró text fájl Adatbázist leíró XML fájl 12
connection modul létrehozása File/New connection.h File/New connection.cpp Az alkalmazás adatbáziskapcsolatát nekünk kell kiépíteni. 13
#define DB_SOURCE_DRIVER "QMYSQL3" #define DB_SOURCE_DBNAME "eaf" #define DB_SOURCE_USER "nacsa" #define DB_SOURCE_PASSWD "1234" #define DB_SOURCE_HOST "localhost" bool createconnections(); connection.h connection.cpp #include <qsqldatabase.h> #include "connection.h" bool createconnections() { QSqlDatabase *source = QSqlDatabase::addDatabase( DB_SOURCE_DRIVER); source->setdatabasename( DB_SOURCE_DBNAME ); source->setusername( DB_SOURCE_USER ); source->setpassword( DB_SOURCE_PASSWD ); source->sethostname( DB_SOURCE_HOST ); if (! source->open() ) { qwarning( "Az adatbázist nem sikerült megnyitni: " + source->lasterror().drivertext() ); qwarning( source->lasterror().databasetext() ); return FALSE; } return TRUE; } 14
File/New/Dialog CsoportRegistrationForm: létrehozás 15
File/New F ő program létrehozása: main.cpp A QtDesigener automatikusan felajánlja a főablakot. 16
main.cpp: generált változat A main.cpp nem tartalmazza az alkalmazás adatbáziskapcsolatát. 17
main.cpp: módosított változat #include <qapplication.h> #include "csoportregistrationform.h" #include "connection.h" int main( int argc, char ** argv ) { QApplication app( argc, argv ); Az alkalmazás adatbáziskapcsolatát nekünk kell megvalósítani. if (!createconnections()) return 1; } CsoportRegistrationForm csopregform; csopregform.show(); app.connect( &app, SIGNAL( lastwindowclosed() ), &app, SLOT( quit() ) ); return app.exec(); 18
ProjectOveview felépítése A QtDesigner Project/Overview ablaka 19
A Config-ban szerepelnie kell thread opciónak. A Qt 3-ban külön be kell állítani! 20
A felev tábla ráhelyezése az ű rlapra 2 Válassza ki a DataTable eszközt! 3 Kattintson az űrlapra! 1 Válassza ki a CsoportRegistration Form űrlapot! 21
Data Table Wizard: Choose the Database and Table Adjuk meg, hogy az adatbázis felev táblájával szeretnénk dolgozni. 22
Data Table Wizard: Displayed Fields 23
Data Table Wizard: Table Properties 24
Data Table Wizard: SQL 25
Data Table Wizard: Finish 26
FelevDataTable Lay Out in a Grid Ctrl+T Tesztelés a QtDesigner adatbáziskezelőjével. 27
CsoportRegistrationForm: Els ő változat futtatása Nincs adatellenőrzés. Új csoport felvitelekor a háttérben meghúzódó felev_id nem kap értéket. Ha még egy rekordot be szeretnénk szúrni, akkor hibaüzenetet kapunk. mysql> select * from felev; +----------+------+-------------+------+------+ felev_id szam kezdet fsz max +----------+------+-------------+------+------+ 37 4 2002/2003-2 4 8 38 3 2002/2003-2 4 1 39 2 2000/2001-1 4 0 40 4 2003/2004-1 4 4 61 1 2003/2004-1 4 1 0 10 xxxxxxx 10 10 +----------+------+-------------+------+------+ 6 rows in set (0.00 sec) 28
FelevDataTable (QDataTable) primeinsert() beforeupdate() beforeinsert() currentchanged() CsoportRegistrationForm (QDialog) Signálok és slotok slotprimeinsertfelev() slotbeforeupdatefelev() slotcurrentchangedfelev() slotprimeinsertfelev(): sorszám kiosztása slotbeforeupdate()felev: adatellenőrzés slotcurrentchangedfelev(): helyi menü állapota 29
slotprimeinsertfelev() 1 2 A felev táblában a slotprimeinsertfelev() slotban kezeljuk a sorszám kiosztását. 30
Edit/Slots.../slotPrimeInsertFelev() slotprimeinsertfelev() 1 2 slotprimeinsertfelev(qsqlrecord* buffer) 3 31
csoportregistrationform.ui.h: slotprimeinsertfelev() Forrásprogram szerkesztő csoportregistrationform.ui.h A kódot nekünk kell begépelni. 32
slotprimeinsertfelev(): kód void CsoportRegistrationForm::slotPrimeInsertFelev( QSqlRecord *buffer ) { // felev_id kitöltése a következ ő sorszámmal QSqlQuery query; query.exec("update sequence Set sequence = sequence + 1 WHERE tablename = 'felev';"); query.exec("select sequence from sequence where tablename = 'felev';"); if (query.next() ) { buffer->setvalue("felev_id", query.value(0)); } } //Kezdetiértékek beállítása buffer->setvalue("szam",1); buffer->setvalue("fsz",4); buffer->setvalue("kezdet","2003/2004-1"); buffer->setvalue("max",20); 33
Signal / slot kapcsolat kiépítése 1 2 34
Sender: FelevDataTable Signal: primeinsert (QSqlrecord*) 35
Receiver: CsoportRegistrationForm Slot: slotpprimeinsertfelev (QSqlrecord*) Sender: FelevDataTable Signal: primeinsert(qsqlrecord*) Receiver: CsoportRegistrationForm Slot: slotprimeinsertfelev(qsqlrecord* buffer) 36
A csopreg.pro fájl SOURCES += connection.cpp \ main.cpp HEADERS += connection.h unix { UI_DIR =.ui MOC_DIR =.moc OBJECTS_DIR =.obj } FORMS = csoportregistrationform.ui TEMPLATE =app CONFIG += qt warn_on release thread DBFILE = csopreg.db LANGUAGE = C++ A projektet leíró fájl tartalma 37
Fordítás/Szerkesztés qmake -o Makefile csopreg.pro make 38
Futtatás:./csopreg Beszúrásnál felajánlja a kezdetiértékeket. A felev_id sorszámot kapott. mysql> select * from felev; +----------+------+-------------+------+------+ felev_id szam kezdet fsz max +----------+------+-------------+------+------+ 37 4 2002/2003-2 4 8 38 3 2002/2003-2 4 1 39 2 2000/2001-1 4 0 40 4 2003/2004-1 4 4 61 1 2003/2004-1 4 1 67 1 2003/2004-2 4 20 +----------+------+-------------+------+------+ 6 rows in set (0.00 sec) 39
Adatellen ő rzés: slotbeforeupdatefelev() 1 Mielőtt az adatokat visszaírjuk az adatbázisba, ellenőrizzünk. (slotbeforeupdatefelev()) 2 3 40
csoportregistrationform.ui.h: slotbeforeupdatefelev() 41
slotbeforeupdatefelev(): kód - 1 void CsoportRegistrationForm::slotBeforeUpdateFelev( QSqlRecord * buffer ) { // A max mez ő értéke nem mehet a létez ő csoportszám alá QSqlQuery query; int foglalt=0; query.exec( "SELECT count(*) FROM csoport WHERE felev_id=" + buffer->value("felev_id").tostring() + ";" ); if (query.next()) foglalt = query.value(0).toint(); if(buffer->value("max").toint() < foglalt) { buffer->setvalue("max",foglalt); QString q = "A maximális csoportszám\n nem lehet kisebb\n a már bejegyzett csoportok számánál! \n Eddig " + QString::number(foglalt) + " db csoport lett bejegyezve."; QMessageBox::information( this, "Félév Regisztráció", q ); } }... 42
slotbeforeupdatefelev(): kód - 2 void CsoportRegistrationForm::slotBeforeUpdateFelev( QSqlRecord * buffer ){... //A szám mez ő értéke 1-4 közé es ő szám if(buffer->value("szam").toint() < 1 buffer->value("szam").toint() > 4) { QMessageBox::information( this, "Félév Regisztráció", "A szám oszlopban csak 1,2,3,4 szerepelhet!"); buffer->setvalue("szam",4); } //A feladatok száma maximum 4 if(buffer->value("fsz").toint() > 4) { QMessageBox::information( this, "Félév Regisztráció", "A feladatok száma maximum 4 lehet!"); buffer->setvalue("fsz",4); } } 43
Signal / Slot kiépítése Sender: FelevDataTable Signal: beforeupdate(qsqlrecord*) Receiver: CsoportRegistrationForm Slot: slotbeforeupdatefelev(qsqlrecord* buffer) Sender: FelevDataTable Signal: beforeinsert(qsqlrecord*) Receiver: CsoportRegistrationForm Slot: slotbeforeupdatefelev(qsqlrecord* buffer) 44
Fordítás/Futtatás qmake./csopreg 45
Környezetfügg ő helyi menü A helyi menüben csak azokat a menüpontokat engedélyezzük, amelyeknek értelme van. 46
slotcurrentchangedfelev(): létrehozás Edit/Slots... slotcurrentchangedfelev(qsqlrecord *buffer) A slotcurrentchangedfelev() slotban állítjuk be a helyi menü aktuális állapotát. 47
slotcurrentchangedfelev() Function: slotcurrentchangedfelev(qsqlrecord *buffer) Return type: void Specifier: virtual Access: public Type: slot QtDesigner QtDesigner csoportregistrationform.ui <slots>... <slot>slotcurrentchangedfelev( QsQlRecord * buffer )</slot> </slots> csoportregistrationform.ui.h void slotcurrentchangedfelev(qsqlrecord* buffer) { } moc csoportregistrationform.h public slots: virtual void slotcurrentchangedfelev(qsqlrecord*) 48
slotcurrentchangedfelev() - Object Explorer Kód beírása 49
slotcurrentchangedfelev(): kód void CsoportRegistrationForm::slotCurrentChangedFelev( QSqlRecord *buffer ) { if (!buffer) return; int count=0; QSqlQuery query("select count(*) FROM felev;") ; if (query.next()) count = query.value(0).toint(); if (count==0){ FelevDataTable->sqlCursor()->setMode( QSqlCursor::Insert); return; } Ha a felev tabla üres, akkor csak insert. } int foglalt=0; query.exec( "SELECT count(*) FROM csoport WHERE felev_id=" + buffer->value("felev_id").tostring() + ";" ); if (query.next()) foglalt = query.value(0).toint(); if ( foglalt == 0 ) { FelevDataTable->sqlCursor()-> setmode( QSqlCursor::Insert QSqlCursor::Delete QSqlCursor::Update ); }else { FelevDataTable->sqlCursor()->setMode( QSqlCursor::Insert QSqlCursor::Update ); } Van már bejegyzett csoport az adott félévre? 50
slotcurrentchangedfelev(): signal/slot kapcsolat Sender: FelevDataTable Signal: currentchanged(qsqlrecord*) Receiver: CsoportRegistrationForm Slot: slotcurrentchangedfelev(qsqlrecord* buffer) 51
Fordítás/Futtattás Ebben a félévben már van bejegyzett csoport. 52
2. lépés 53
A csoport tábla elhelyezése FelevDataTable CsoportDataTable Főablak + félév tábla létrehozása Csoport tábla Gombok hozzáadása, dialógus elkészítése A feladat második lépéseként helyezzük el a csoport táblát az űrlapon, majd kapcsoljuk össze a két táblát. 54
FelevDataTable (QDataTable) primeinsert() beforeupdate() beforeinsert() currentchanged() CsoportDataTable (QDataTable) primeinsert() CsoportRegistrationForm (QDialog) slotprimeinsertfelev() slotbeforeupdatefelev() slotcurrentchangedfelev() newcurrentfelev() slotprimeinsertcsoport() Signálok és slotok init() newcurrentfelv(): csoport tábla fissítése slotprimeinsertcsoport(): csoport_id beállítása 55
A CsoportDataTable átméretezése Töröljük a korábbi elrendezést (Break Layout), és méretezzük át a félév táblát! 56
A FelevDataTable elhelyezése A Data Table eszköz kiválasztása után kattintson az űrlapra, majd Válaszoljon a Data Table Wizard kérdéseire. 57
Data Table Wizard: Choose Database and Table A projekt adatbáziskapcsolata már létezik (csopreg.pro), ezért itt már csak a jelszót kérdezi. 58
Data Table Wizard: Displayed Fields 59
Data Table Wizard: Table Properties 60
Data Table Wizard: SQL 61
Data Table Wizard: Finish 62
Táblák elrendezése Jelöljök ki mindkét táblát! A második tábla neve: CsoportDataTable 63
newcurrentfelev(): slot + connections Ha új sort új rekordot választunk a felev táblában, akkor a csoport táblát frissíteni kell. Edet/Slots.../New Function Function: newcurrentfelev(qsqlrecord *buffer) Return type: void Specifier: virtual Access: public Type: slot Edit/Connections/New Sender: FelevDataTable Signal: currentchanged(qsqlrecord*) Receiver: CsoportRegistrationForm Slot: newcurrentfelev(qsqlrecord* buffer) 64
newcurrentfelev(): kód void CsoportRegistrationForm::newCurrentFelev( QSqlRecord * buffer ) { CsoportDataTable->setFilter("felev_id=" +buffer->value("felev_id").tostring()) ; CsoportDataTable->refresh(); } 65
slotprimeinsertcsoport(): slot + connections Ha új sort új rekordot szúrunk be a csoport táblában, akkor a csoport_id és a felev_id értékeket nekünk kell kitölteni a segéd pufferben. Ezt valósítjuk meg ebben a slotban. Edet/Slots.../New Function Function: slotprimeinsertcsoport(qsqlrecord *buffer) Return type: void Specifier: virtual Access: public Type: slot Edit/Connections/New Sender: CsoportDataTable Signal: primeinsert(qsqlrecord*) Receiver: CsoportRegistrationForm Slot: slotprimeinsertcsoport(qsqlrecord* buffer) 66
slotprimeinsercsoport(): kód void CsoportRegistrationForm::slotPrimeInsetCsoport( QSqlRecord * buffer ){ //csoport_id lekérdezése QSqlQuery query; query.exec("update sequence Set sequence = sequence + 1 where tablename = 'csoport';"); query.exec("select sequence from sequence where tablename = 'csoport';"); if (query.next() ) { buffer->setvalue("csoport_id", query.value(0)); } //felev_id kitöltése buffer->setvalue("felev_id", FelevDataTable->currentRecord()->value("felev_id")); //Kezdetiértékek beállítása buffer->setvalue("max",30); } 67
Fordítás/Futtatás? Indulásnál a szűr ő még nem működik. A konstruktorban kellene szűrni. Az ui.h -s technikában az init() függvényben adjuk meg a konstruktor -beli teendőket. Itt még nem működik a szűrés. Ez lenne a jó tábla. 68
CsoportRegistrationForm inicializálása - init(): létrehozás 69
CsoportRegistrationForm inicializálása - init(): kód void CsoportRegistrationForm::init() { if (FelevDataTable && CsoportDataTable && FelevDataTable->numRows() >0) { FelevDataTable->selectRow(0); slotcurrentchangedfelev(felevdatatable->currentrecord()); CsoportDataTable->setFilter("felev_id=" + FelevDataTable->currentRecord()->value("felev_id").toString()); CsoportDataTable->refresh(); if (CsoportDataTable->numRows()>0) CsoportDataTable->selectRow(0); } } 70
3. rész 71
A csoportokat egy önálló dialógusablakban szeretnénk szerkeszteni. F ablak + félév tábla létrehozása ő Csoport tábla Gombok hozzáadása, dialógus elkészítése 72
A CsoportRegistrationForm ű rlap módosítása FelevDataTable CsoportDataTable EditPushButton QuitPushButton editclicked() slot 73
FelevDataTable (QDataTable) primeinsert() beforeupdate() beforeinsert() currentchanged() CsoportDataTable (QDataTable) primeinsert() cursorchanged() CsoportRegistrationForm (QDialog) slotprimeinsertfelev() slotbeforeupdatefelev() slotcurrentchangedfelev() newcurrentfelev() slotprimeinsertcsoport() slotcursorchangedcsoport() editclicked() accept() Signálok és slotok EditCsoportForm (QDialog) setfelevid() felevid() EditPushButton (QPushButton) clicked() QuitPushButton (QPushButton) clicked() init() newcurrentfelev(): és slotcursorchangedcsoport(): Szerkesztés gomb frissítése int _felev_id; editclicked() dialog->setsqlcursor() dialog->setfilter() dialog->setsort() dialog->setfelevid() 74
A Kilépés ilépés gomb eseménykezelése: signál/slot kapcsolat Sender: QuitPushButton Signal: clicked() Receiver: CsoportRegistrationForm Slot: accept() 75
EditCsoportForm dialógusablak 76
EditCsoportForm dialógus: létrehozása File/New/dialog Caption: Csoport tábla szerkesztése name: EditCsoportForm Save As: editcsoportform.ui 77
78
79
80
81
82
83
84
1 CsoportDataBrowser Az adatreprezentáló cursort mi adjuk meg!! 2 85
Az EditCsoportForm felépítése EditCsoportForm LabelKezdet LabelSzint ComboBoxGyakvez QLineEditNev QSpinBoxMax QSpinBoxGyakvez_id PushButtonLast CsoportDataBrowser 86
Új adattag beillesztése Az EditCsoportForm-ot kell kiválasztani! 1 int _felev_id; 2 3 87
A felev_id adattagot kezel ő függvények: létrehozás Function: felevid() Return type: int Specifier: non virtual Access: public Type: function Function: setffelevid(int felev_id ) Return type: void Specifier: non virtual Access: public Type: function 88
A _felev_id adattagot kezel ő függvények: kód int EditCsoportForm::felevId() { return _felev_id; } void EditCsoportForm::setFelevId( int felev_id ){ _felev_id=felev_id; QSqlQuery query("select kezdet,szam FROM felev WHERE felev_id=" + QString::number(_felev_id) + ";"); if (query.next()) { LabelKezdet->setText(query.value(0).toString()); LabelSzint->setText("EAF" + query.value(1).tostring()); } } 89
A Szerkesztés zerkesztés gomb slotja - editclicked() slot Edit/Slots Function:editClicked() Return type: void Specifier: virtual Access: public Type: slot Edit/Connections sender: EditPushButton signal: clicked() receiver: CsoportRegistrationForm slot: editclicked() 90
EditClicked() slot: kód void CsoportRegistrationForm::editClicked(){ EditCsoportForm *dialog = new EditCsoportForm( this, "Edit Csoport Form", TRUE ); QSqlCursor cursor( "csoport" ); dialog->csoportdatabrowser->setsqlcursor( &cursor ); dialog->csoportdatabrowser->setfilter( CsoportDataTable->filter() ); dialog->csoportdatabrowser->setsort(qsqlindex::fromstringlist( CsoportDataTable->sort(), &cursor ) ); dialog->csoportdatabrowser->refresh(); int i = CsoportDataTable->currentRow(); if ( i == -1 ) i = 0; // Always use the first row CsoportDataTable->selectRow(i); dialog->setfelevid(csoportdatatable->currentrecord()->value("felev_id").toint()); dialog->csoportdatabrowser->seek( i ); dialog->exec(); delete dialog; CsoportDataTable->refresh(); if (CsoportDataTable->numRows()==0) EditPushButton->setEnabled(FALSE); else EditPushButton->setEnabled(TRUE); } Az implementációban hivatkozunk az EditCsoportForm és a CsoportDataBrowser osztályokra, ezért ezek header fájljait be kell illeszteni a projektbe. 91
Header fájlok beillesztése 1 A ProjectOverview ablakban válassza ki a CsoportRegistrationForm-ot! Kattintson az egér jobb fülére, majd válassza ki a New menüpontot. 2 92
Fordítás/Futtatás 93
A Szerkesztés gomb engedélyezése/tíltása Edit/Slots Function: slotcursorchangedcsoport() Return type: void Specifier: virtual Access: public Type: slot Edit/Connections sender: CsoportDataTable signal: cursorchanged(qsql::op) receiver: CsoportRegistrationForm slot: slotcursorchangedcsoport() 94
A newcurrentfelev() slot módosítása void CsoportRegistrationForm::newCurrentFelev( QSqlRecord * buffer ){ CsoportDataTable->setFilter("felev_id=" +buffer->value("felev_id").tostring()) ; CsoportDataTable->refresh(); } if (CsoportDataTable->numRows()>0) CsoportDataTable->selectRow(0); if (CsoportDataTable->numRows()==0) EditPushButton->setEnabled(FALSE); else EditPushButton->setEnabled(TRUE); 95
Az init() módosítása void CsoportRegistrationForm::init() { if (FelevDataTable && CsoportDataTable && FelevDataTable->numRows() >0) { FelevDataTable->selectRow(0); slotcurrentchangedfelev(felevdatatable->currentrecord()); CsoportDataTable->setFilter("felev_id=" + FelevDataTable->currentRecord()->value("felev_id").toString()); CsoportDataTable->refresh(); if (CsoportDataTable->numRows()>0) CsoportDataTable->selectRow(0); if (CsoportDataTable->numRows()==0) EditPushButton->setEnabled(FALSE); else EditPushButton->setEnabled(TRUE); } } 96
Az EditCsoportForm osztály további függvényei és slotjai Önálló feldolgozásra 97
Signálok és slotok EditCsoportForm (QDialog) slotfelevid() slotprimeinsert() slotprimeupdate() slotgyakvezchanged() CsoportDataBrowser (QDataBrowser) primeinsert() primeupdate() init() LabelKezdet (QLabel) QLineEditNev (QLineEdit) QSpinBoxMax (QSpinBox) init() QSpinBoxGyakvez_id (QSpinBox) activated() felevid() int _felev_id; LabelSzint (QLabel) PushButtonFirst (QPushButtonl) setfelevid() LabelSzint->setText() LabelKezdet->setText() ComboBoxGyakvez (QComboBox) PushButtonClose (QPushButton) 98
EditCsoportForm:: init() void EditCsoportForm::init() { QSqlQuery query ("SELECT nev FROM gyakvez ORDER BY nev;"); while (query.next()) ComboBoxGyakvez->insertItem(query.value(0).toString()); } A gyakorlatvezet nevét ő tartalmazó ComboBox kitöltése 99
EditCsoportForm:: slotprimeinsert() Edit/Slots/New Function/implementáció begépelése void EditCsoportForm::slotPrimeInsert( QSqlRecord * buffer ){ QSqlQuery query; query.exec("update sequence Set sequence = sequence + 1 where tablename = 'csoport';"); query.exec("select sequence from sequence where tablename = 'csoport';"); if (query.next() ) { buffer->setvalue("csoport_id", query.value(0)); } buffer->setvalue("felev_id", QString::number(_felev_id)); } Edit/Connections sender: CsoportDataBrowser signal: primeinsert(qsqlrecord*) receiver: EditCsoportForm slot: slotprimeinsert(qsqlrecord*) 100
EditCsoportForm:: slotprimeupdate() - 1 Edit/Slots/New Function/implementáció begépelése void EditCsoportForm::slotPrimeUpdate( QSqlRecord * buffer ){ if (!buffer) return; //Ki a gyakorlatvezetö QString q="select nev FROM gyakvez WHERE gyakvez_id='" + buffer->value("gyakvez_id").tostring() + "';"; QSqlQuery query (q); QString gyakvez = ""; if (query.next()) gyakvez=query.value(0).tostring(); //Állítsuk be a gyakvez ComboBox értékét for (int i=0; i < ComboBoxGyakvez->count(); i++) { if (ComboBoxGyakvez->text(i)==gyakvez) { ComboBoxGyakvez->setCurrentItem(i); break; } }... } 101
EditCsoportForm:: slotprimeupdate() - 2 Edit/Slots/New Function/implementáció begépelése void EditCsoportForm::slotPrimeUpdate( QSqlRecord * buffer ){... //Állítsuk be a max Spin box minimális értékét int foglalt=0; query.exec( "SELECT count(*) FROM tag WHERE csoport_id=" + buffer->value("csoport_id").tostring() + ";" ); if (query.next()) foglalt = query.value(0).toint(); QSpinBoxMax->setMinValue(foglalt); } Edit/Connections sender: CsoportDataBrowser signal: primeupdate(qsqlrecord*) receiver: EditCsoportForm slot: slotprimeupdate(qsqlrecord*) 102
EditCsoportForm: Header fájlok beillesztése A slotprimeupdate() slot deklarációs és definíciós részében is hivatkozunk a QSqlRecord osztályra. 1 editcsoportform.h class QSqlRecord;... public slots: void slotprimeupdate(qsqlrecord* buffer)... editcsoportform.cpp 2 3 #include <qsqlrecord.h>.. void slotprimeupdate(qsqlrecord* buffer) { } 103
EditCsoportForm:: slotgyakvezchanged() Edit/Slots/New Function/implementáció begépelése void EditCsoportForm::slotGyakvezChanged( const QString & g ){ //Mi a gyakorlatvezetö id-je? QString q="select gyakvez_id FROM gyakvez WHERE nev='" + g + "';"; QSqlQuery query (q); if (query.next()) QSpinBoxGyakvez_id->setValue(query.value(0).toInt()); CsoportDataBrowser->update(); } Edit/Connections sender: ComboBoxGyakvez signal: activated(const QString &) receiver: EditCsoportForm slot: slotgyakvezchanged(const QString &) Ha új gyakorlatvezetőt választottunk, akkor a névhez tartozó gyakvez_id-t kell megjeleníteni a vezérlőn. 104
Vége 105
FelevDataTable (QDataTable) primeinsert() beforeupdate() currentchanged() beforeinsert() CsoportDataTable (QDataTable) primeinsert() cursorchanged() CsoportRegistrationForm (QDialog) slotprimeinsertfelev() slotbeforeupdatefelev() slotcurrentchangedfelev() newcurrentfelev() slotprimeinsertcsoport() slotcursorchangedcsoport() editclicked() accept() A projekt osztálydiagramja -1 EditCsoportForm (QDialog) slotfelevid() slotprimeinsert() slotprimeupdate() slotgyakvezchanged() init() EditPushButton (QPushButton) clicked() init() felevid() int _felev_id; QuitPushButton (QPushButton) clicked() 106
CsoportRegistrationForm (QDialog) CsoportDataBrowser (QDataBrowser) QLineEditNev (QLineEdit) primeinsert() primeupdate() EditCsoportForm (QDialog) init() QSpinBoxMax (QSpinBox) slotfelevid() slotprimeinsert() slotprimeupdate() slotgyakvezchanged() LabelKezdet (QLabel) QSpinBoxGyakvez_id (QSpinBox) init() LabelSzint (QLabel) PushButtonFirst (QPushButtonl) felevid() int _felev_id; A projekt osztálydiagramja -2 ComboBoxGyakvez (QComboBox) PushButtonClose (QPushButton) 107
FelevDataTable (QDataTable) primeinsert() beforeupdate() beforeinsert() currentchanged() CsoportDataTable (QDataTable) primeinsert() cursorchanged() CsoportRegistrationForm (QDialog) slotprimeinsertfelev() slotbeforeupdatefelev() slotcurrentchangedfelev() newcurrentfelev() slotprimeinsertcsoport() slotcursorchangedcsoport() editclicked() accept() Signálok és slotok - 1 EditCsoportForm (QDialog) setfelevid() slotprimeinsert() slotprimeupdate() slotgyakvezchanged() init() EditPushButton (QPushButton) clicked() init() felevid() int _felev_id; QuitPushButton (QPushButton) clicked() editclicked() dialog->setsqlcursor() dialog->setfilter() dialog->setsort() dialog->setfelevid() 108
Signálok és slotok - 2 CsoportDataBrowser (QDataBrowser) QLineEditNev (QLineEdit) EditCsoportForm (QDialog) setfelevid() slotprimeinsert() slotprimeupdate() slotgyakvezchanged() primeinsert() primeupdate() init() LabelKezdet (QLabel) QSpinBoxMax (QSpinBox) QSpinBoxGyakvez_id (QSpinBox) init() activated() felevid() int _felev_id; LabelSzint (QLabel) PushButtonFirst (QPushButtonl) setfelevid() LabelSzint->setText() LabelKezdet->setText() ComboBoxGyakvez (QComboBox) PushButtonClose (QPushButton) 109