elemialkalmazások fejlesztése iv. adatbáziskezelő ... bemutato.pdffile/new connection.cpp...
TRANSCRIPT
1
Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.Elemi alkalmazások fejlesztése IV.
Adatbáziskezel őAdatbáziskezel őAdatbáziskezel őAdatbáziskezel őAdatbáziskezel őAdatbáziskezel őAdatbáziskezel őAdatbáziskezel őAdatbáziskezel őAdatbáziskezel őalkalmazás készítése alkalmazás készítése alkalmazás készítése alkalmazás készítése alkalmazás készítése alkalmazás készítése alkalmazás készítése alkalmazás készítése alkalmazás készítése alkalmazás készítése
QtDesignerbenQtDesignerben
Készítette: Szabóné Nacsa Rozália
2
““““““““““Származtatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezet
Qt
U form.h
formbase.cpp main.cpp
form.ui
Írás, olvasásOlvasásGenerálás#includesEszköz (tool)Generált forráskódFelhasználó forráskódja
formbase.h
form.cpp
Örö
kldé
ső
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.
3
““““““““““Származtatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezetSzármaztatásos” modulszerkezet
Qt
U form.h
formbase.cpp main.cpp
form.ui
Írás, olvasásOlvasásGenerálás#includesEszköz (tool)Generált forráskódFelhasználó forráskódja
formbase.h
form.cpp
Örö
kldé
ső
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.
“saját”
“saját”
4
““““““““““ui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezetui.h”-s modulszerkezet
Qt designer
U
form.cpp main.cpp
form.ui
Írás, olvasásOlvasásGenerálás#includesEszköz (tool)Generált forráskódFelhasználó forráskódja
form.h
form.ui
form.ui.h
Az alkalmazásspecifius funkciókat a form.ui.h implementációs fájlban
adjuk meg.
5
A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai A QtDesigner ablakai
Toolbox
ProjectOverview
ObjectExplorer Properties Editor/Signal Handlers
6
FeladatFeladatFeladatFeladatFeladatFeladatFeladatFeladatFeladatFeladat
Új csoportok felvétele, bejegyzett csoportok módosítása, törlése.
7
Feladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépéseiFeladat – a megvalósítás lépései
Új csoportok felvétele, bejegyzett csoportok módosítása, törlése.
1
2
3 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
8
FelevDataTable(QDataTable)
primeInsert()beforeUpdate()
currentChanged()beforeInsert()
CsoportDataTable(QDataTable)
primeInsert()cursorChanged()
EditPushButton(QPushButton)
clicked()
QuitPushButton(QPushButton)
clicked()
CsoportRegistrationForm(QDialog)
EditCsoportForm(QDialog)
A CsoportRegistrationForm osztálydiagramja
9
Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása:Új projekt létrehozása: File/New/C++ Project File/New/C++ Project
10
Project Overview: Project Overview: Project Overview: Project Overview: Project Overview: Project Overview: Project Overview: Project Overview: Project Overview: Project Overview: csopreg.procsopreg.pro
11
Project/Database connections ...Project/Database connections ...Project/Database connections ...Project/Database connections ...Project/Database connections ...Project/Database connections ...Project/Database connections ...Project/Database connections ...Project/Database connections ...Project/Database connections ...
1
2
3
4
5
12
Projekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolásaProjekt és adatbázis leíró tárolása
Adatbázist leíró XML fájl
A projektet leíró text fájl
13
connectionconnection modul létrehozása modul létrehozása modul létrehozása modul létrehozása modul létrehozása modul létrehozása modul létrehozása modul létrehozása modul létrehozása modul létrehozása
File/New connection.cpp
File/New connection.h
Az alkalmazás adatbáziskapcsolatát nekünk kell kiépíteni.
14
#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();
#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; }
connection.cpp
connection.h
15
CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: CsoportRegistrationForm: létrehozás létrehozás
File/New/Dialog
16
F program létrehozása: őF program létrehozása: őF program létrehozása: őF program létrehozása: őF program létrehozása: őF program létrehozása: őF program létrehozása: őF program létrehozása: őF program létrehozása: őF program létrehozása: ő main.cppmain.cpp
File/New
A QtDesigener automatikusan felajánlja a f ablakot.ő
17
main.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változatmain.cpp: generált változat
A main.cpp nem tartalmazza az alkalmazás adatbáziskapcsolatát.
18
main.cpp: módosított változatmain.cpp: módosított változatmain.cpp: módosított változatmain.cpp: módosított változatmain.cpp: módosított változatmain.cpp: módosított változatmain.cpp: módosított változatmain.cpp: módosított változatmain.cpp: módosított változatmain.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 );
if (!createConnections())return 1;
CsoportRegistrationForm csopRegForm; csopRegForm.show(); app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) ); return app.exec();}
Az alkalmazás adatbáziskapcsolatát nekünk kell megvalósítani.
19
ProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítéseProjectOveview felépítése
A QtDesigner Project/Overview
ablaka
20
A Config-ban szerepelnie kell
thread opciónak.
A Qt 3-ban külön be kell állítani!
21
A A A A A A A A A A felevfelev tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű tábla ráhelyezése az rlapraű
1
2
3
Válassza ki a CsoportRegistration
Form rlapot!ű
Válassza ki a DataTable eszközt!
Kattintson az rlapra!ű
22
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Choose the Database and TableChoose the Database and Table
Adjuk meg, hogy az adatbázis felev táblájával szeretnénk
dolgozni.
23
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Displayed FieldsDisplayed Fields
24
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Table PropertiesTable Properties
25
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: SQLSQL
26
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: FinishFinish
27
Lay Out in a Grid
Ctrl+T
Tesztelés a QtDesigner
adatbáziskezel jével.ő
FelevDataTable
28
CsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaőCsoportRegistrationForm: Els változat futtatásaő
Új csoport felvitelekor a háttérben meghúzódó felev_id nem kap
értéket.
Nincs adatellen rzés.ő
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)
Ha még egy rekordot be szeretnénk szúrni, akkor hibaüzenetet
kapunk.
29
FelevDataTable(QDataTable)
primeInsert()beforeUpdate()beforeInsert()
currentChanged()
CsoportRegistrationForm(QDialog)
slotPrimeInsertFelev()slotBeforeUpdateFelev()slotCurrentChangedFelev()
Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok
slotPrimeInsertFelev(): sorszám kiosztásaslotBeforeUpdate()Felev: adatellen rzésőslotCurrentChangedFelev(): helyi menü állapota
30
slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()slotPrimeInsertFelev()
A felev táblában a slotPrimeInsertFelev()
slotban kezeljuk a sorszám kiosztását.
1
2
31
Edit/Slots.../Edit/Slots.../Edit/Slots.../Edit/Slots.../Edit/Slots.../Edit/Slots.../Edit/Slots.../Edit/Slots.../Edit/Slots.../Edit/Slots.../slotPrimeInsertFelev()slotPrimeInsertFelev()
1
2
3
slotPrimeInsertFelev(QSqlRecord* buffer)
32
csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()csoportregistrationform.ui.h: slotPrimeInsertFelev()
Forrásprogram szerkesztő
csoportregistrationform.ui.h
A kódot nekünk kell begépelni.
33
slotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): kódslotPrimeInsertFelev(): 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);}
34
Signal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítéseSignal / slot kapcsolat kiépítése
1
2
35
Sender: FelevDataTable
Signal: primeInsert(QSqlrecord*)
36
Receiver: CsoportRegistrationForm
Slot: slotPprimeInsertFelev(QSqlrecord*)
Sender: FelevDataTableSignal: primeInsert(QSqlRecord*)Receiver: CsoportRegistrationFormSlot: slotPrimeInsertFelev(QSqlRecord* buffer)
37
A csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájlA csopreg.pro fájl
SOURCES += connection.cpp \ main.cpp
HEADERS += connection.hunix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj}FORMS = csoportregistrationform.uiTEMPLATE =appCONFIG += qt warn_on release threadDBFILE = csopreg.dbLANGUAGE = C++
A projektet leíró fájl tartalma
38
Fordítás/SzerkesztésFordítás/SzerkesztésFordítás/SzerkesztésFordítás/SzerkesztésFordítás/SzerkesztésFordítás/SzerkesztésFordítás/SzerkesztésFordítás/SzerkesztésFordítás/SzerkesztésFordítás/Szerkesztés
qmake -o Makefile csopreg.promake
39
Futtatás: Futtatás: Futtatás: Futtatás: Futtatás: Futtatás: Futtatás: Futtatás: Futtatás: Futtatás: ./csopreg./csopreg
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)
A felev_id sorszámot
kapott.
Beszúrásnál felajánlja a kezdetiértékeket.
40
Adatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: őAdatellen rzés: ő slotBeforeUpdateFelev()slotBeforeUpdateFelev()
Miel tt az adatokat visszaírjuk őaz adatbázisba, ellen rizzünk.ő
(slotBeforeUpdateFelev())
1
2
3
41
csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h:csoportregistrationform.ui.h: slotBeforeUpdateFelev() slotBeforeUpdateFelev()
42
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 ); } . . .}
slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1slotBeforeUpdateFelev(): kód - 1
43
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); }}
slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2slotBeforeUpdateFelev(): kód - 2
44
Signal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítéseSignal / Slot kiépítése
Sender: FelevDataTableSignal: beforeUpdate(QSqlRecord*)Receiver: CsoportRegistrationFormSlot: slotBeforeUpdateFelev(QSqlRecord* buffer)
Sender: FelevDataTableSignal: beforeInsert(QSqlRecord*)Receiver: CsoportRegistrationFormSlot: slotBeforeUpdateFelev(QSqlRecord* buffer)
45
Fordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/Futtatás
qmake./csopreg
46
Környezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüőKörnyezetfügg helyi menüő
A helyi menüben csak azokat a menüpontokat
engedélyezzük, amelyeknek értelme van.
47
slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): létrehozáslétrehozás
slotCurrentChangedFelev(QSqlRecord *buffer)
Edit/Slots...
A slotCurrentChangedFelev() slotban állítjuk be a helyi menü aktuális
állapotát.
48
slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()slotCurrentChangedFelev()Function: slotCurrentChangedFelev(QSqlRecord *buffer)Return type: voidSpecifier: virtualAccess: publicType: slot
public slots:virtual void slotCurrentChangedFelev(QSqlrecord*)
csoportregistrationform.h
void slotCurrentChangedFelev(QSqlrecord* buffer){}
csoportregistrationform.ui.h
csoportregistrationform.ui
<slots> . . . <slot>slotCurrentChangedFelev( QsQlRecord * buffer )</slot></slots>
QtDesignerQtDesigner
moc
49
slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - slotCurrentChangedFelev() - Object ExplorerObject Explorer
Kód beírása
50
slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): kódkódvoid 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; }
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 ); }}
Ha a felev tabla üres, akkor csak insert.
Van már bejegyzett csoport az adott
félévre?
51
slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): slotCurrentChangedFelev(): signal/slot kapcsolatsignal/slot kapcsolat
Sender: FelevDataTableSignal: currentChanged(QSqlRecord*)Receiver: CsoportRegistrationFormSlot: slotcurrentChangedFelev(QSqlRecord* buffer)
52
Fordítás/FuttattásFordítás/FuttattásFordítás/FuttattásFordítás/FuttattásFordítás/FuttattásFordítás/FuttattásFordítás/FuttattásFordítás/FuttattásFordítás/FuttattásFordítás/Futtattás
Ebben a félévben már van bejegyzett csoport.
53
2. lépés2. lépés2. lépés2. lépés2. lépés2. lépés2. lépés2. lépés2. lépés2. lépés
54
A csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezéseA csoport tábla elhelyezése
F ablak + félév tábla létrehozásaő Csoport tábla Gombok hozzáadása, dialógus elkészítése
FelevDataTable
CsoportDataTable
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.
�
55
FelevDataTable(QDataTable)
primeInsert()beforeUpdate()beforeInsert()
currentChanged()
CsoportDataTable(QDataTable)
primeInsert()
CsoportRegistrationForm(QDialog)
slotPrimeInsertFelev()slotBeforeUpdateFelev()
slotCurrentChangedFelev()newCurrentFelev()
slotPrimeInsertCsoport()
init()
Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok Signálok és slotok
newCurrentFelv(): csoport tábla fissítéseslotPrimeInsertCsoport(): csoport_id beállítása
56
A CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA CsoportDataTable átméretezéseA 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!
57
A FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezéseA FelevDataTable elhelyezése
Válaszoljon a Data Table Wizard kérdéseire.
A Data Table eszköz kiválasztása után kattintson
az rlapra, majdű
58
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Choose Database and TableChoose Database and Table
A projekt adatbáziskapcsolata már létezik (csopreg.pro), ezért itt már csak a jelszót
kérdezi.
59
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Displayed FieldsDisplayed Fields
60
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Table PropertiesTable Properties
61
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: SQLSQL
62
Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: Data Table Wizard: FinishFinish
63
Táblák elrendezéseTáblák elrendezéseTáblák elrendezéseTáblák elrendezéseTáblák elrendezéseTáblák elrendezéseTáblák elrendezéseTáblák elrendezéseTáblák elrendezéseTáblák elrendezése
Jelöljök ki mindkét táblát!
A második tábla neve: CsoportDataTable
64
newCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connectionsnewCurrentFelev(): slot + connections
Ha új sort – új rekordot – választunk a felev táblában, akkor a csoport táblát frissíteni kell.
Edit/Connections/New
Edet/Slots.../New Function
Function: newCurrentFelev(QSqlRecord *buffer)Return type: voidSpecifier: virtualAccess: publicType: slot
Sender: FelevDataTableSignal: currentChanged(QSqlRecord*)Receiver: CsoportRegistrationFormSlot: newCurrentFelev(QSqlRecord* buffer)
65
newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): newCurrentFelev(): kódkód
void CsoportRegistrationForm::newCurrentFelev( QSqlRecord * buffer ){ CsoportDataTable->setFilter("felev_id=" +buffer->value("felev_id").toString()) ; CsoportDataTable->refresh();}
66
slotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): slot + connectionsslotPrimeInsertCsoport(): 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.
Sender: CsoportDataTableSignal: primeInsert(QSqlRecord*)Receiver: CsoportRegistrationFormSlot: slotPrimeInsertCsoport(QSqlRecord* buffer)
Edit/Connections/New
Edet/Slots.../New Function
Function: slotPrimeInsertCsoport(QSqlRecord *buffer)Return type: voidSpecifier: virtualAccess: publicType: slot
67
slotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kódslotPrimeInserCsoport(): kód
void CsoportRegistrationForm::slotPrimeInsetCsoport( QSqlRecord * buffer ){//csoport_id lekérdezéseQSqlQuery 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); }
68
Fordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordí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.
69
CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - init():init():init():init():init():init():init():init():init():init(): létrehozás létrehozás
70
CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - CsoportRegistrationForm inicializálása - init():init():init():init():init():init():init():init():init():init(): kód 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);
}}
71
3. rész3. rész3. rész3. rész3. rész3. rész3. rész3. rész3. rész3. rész
72
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
73
A CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaűA CsoportRegistrationForm rlap módosításaű
CsoportDataTable
FelevDataTable
EditPushButtonQuitPushButton
editClicked() slot
74
FelevDataTable(QDataTable)
primeInsert()beforeUpdate()beforeInsert()
currentChanged()
CsoportDataTable(QDataTable)
primeInsert()cursorChanged()
EditPushButton(QPushButton)
clicked()
QuitPushButton(QPushButton)
clicked()
CsoportRegistrationForm(QDialog)
slotPrimeInsertFelev()slotBeforeUpdateFelev()
slotCurrentChangedFelev()newCurrentFelev()
slotPrimeInsertCsoport()slotCursorChangedCsoport()
editClicked()
accept()
init()
EditCsoportForm(QDialog)
setFelevId()
felevId()
int _felev_id;
Signálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotok
editClicked()dialog->setSqlCursor()dialog->setFilter()dialog->setSort()dialog->setFelevId()
newCurrentFelev(): ésslotCursorChangedCsoport():Szerkesztés gomb frissítése
75
A “A “A “A “A “A “A “A “A “A “KKilépésilépés” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat” gomb eseménykezelése: signál/slot kapcsolat
Sender: QuitPushButtonSignal: clicked()Receiver: CsoportRegistrationFormSlot: accept()
76
EditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablakEditCsoportForm dialógusablak
77
EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: EditCsoportForm dialógus: létrehozásalétrehozása
File/New/dialog
Caption: Csoport tábla szerkesztése
name: EditCsoportForm
Save As: editcsoportform.ui
78
79
80
81
82
83
84
85
CsoportDataBrowserAz adatreprezentáló
cursort mi adjuk meg!!
1
2
86
Az EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítéseAz EditCsoportForm felépítése
LabelKezdet
LabelSzint
ComboBoxGyakvez
EditCsoportForm
CsoportDataBrowser
QLineEditNev
QSpinBoxMax
QSpinBoxGyakvez_id
PushButtonLast
87
Új adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztéseÚj adattag beillesztése
int _felev_id;
Az EditCsoportForm-ot
kell kiválasztani!1
2
3
88
A felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: őA felev_id adattagot kezel függvények: ő létrehozáslétrehozás
Function: felevId()Return type: intSpecifier: non virtualAccess: publicType: function
Function: setFfelevId(int felev_id )Return type: voidSpecifier: non virtualAccess: publicType: function
89
A _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: őA _felev_id adattagot kezel függvények: ő kódkó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());
}}
90
A “A “A “A “A “A “A “A “A “A “SSzerkesztészerkesztés” gomb slotja - ” gomb slotja - ” gomb slotja - ” gomb slotja - ” gomb slotja - ” gomb slotja - ” gomb slotja - ” gomb slotja - ” gomb slotja - ” gomb slotja - editClicked() slot editClicked() slot
Edit/Slots
Edit/Connections
Function:editClicked() Return type: voidSpecifier: virtualAccess: publicType: slot
sender: EditPushButtonsignal: clicked()receiver: CsoportRegistrationFormslot: editClicked()
91
EditClicked() slot: kódEditClicked() slot: kódEditClicked() slot: kódEditClicked() slot: kódEditClicked() slot: kódEditClicked() slot: kódEditClicked() slot: kódEditClicked() slot: kódEditClicked() slot: kódEditClicked() 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.
92
Header fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztéseHeader fájlok beillesztése
Kattintson az egér jobb fülére, majd válassza ki a
New menüpontot.
A ProjectOverview ablakban válassza ki a
CsoportRegistrationForm-ot!
1
2
93
Fordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/FuttatásFordítás/Futtatás
94
A A A A A A A A A A SSzerkesztészerkesztés gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása gomb engedélyezése/tíltása
Edit/Slots
Edit/Connections
Function: slotCursorChangedCsoport() Return type: voidSpecifier: virtualAccess: publicType: slot
sender: CsoportDataTablesignal: cursorChanged(QSql::Op)receiver: CsoportRegistrationFormslot: slotCursorChangedCsoport()
95
A newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA newCurrentFelev() slot módosításaA 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);
}
96
Az init() módosításaAz init() módosításaAz init() módosításaAz init() módosításaAz init() módosításaAz init() módosításaAz init() módosításaAz init() módosításaAz init() módosításaAz 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);
}}
97
Az EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztályAz EditCsoportForm osztály további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai további függvényei és slotjai
Önálló feldolgozásra
98
EditCsoportForm(QDialog)
slotFelevId()slotPrimeInsert()
slotPrimeUpdate()slotGyakvezChanged()
init()
felevId()
int _felev_id;
CsoportDataBrowser(QDataBrowser)
primeInsert()primeUpdate()
init()
LabelKezdet(QLabel)
LabelSzint(QLabel)
ComboBoxGyakvez(QComboBox)
QLineEditNev(QLineEdit)
QSpinBoxMax(QSpinBox)
QSpinBoxGyakvez_id(QSpinBox)
activated()
PushButtonFirst(QPushButtonl)
PushButtonClose(QPushButton)
setFelevId()LabelSzint->setText()LabelKezdet->setText()
Signálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotokSignálok és slotok
99
EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: init()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
100
EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: slotPrimeInsert()slotPrimeInsert()
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: CsoportDataBrowsersignal: primeInsert(QSqlRecord*)receiver: EditCsoportFormslot: slotPrimeInsert(QSqlRecord*)
Edit/Slots/New Function/implementáció begépelése
101
EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: slotPrimeUpdate() - 1slotPrimeUpdate() - 1
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;}
} . . .}
Edit/Slots/New Function/implementáció begépelése
102
EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: slotPrimeUpdate() - 2slotPrimeUpdate() - 2
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: CsoportDataBrowsersignal: primeUpdate(QSqlRecord*)receiver: EditCsoportFormslot: slotPrimeUpdate(QSqlRecord*)
Edit/Slots/New Function/implementáció begépelése
103
EditCsoportForm: EditCsoportForm: EditCsoportForm: EditCsoportForm: EditCsoportForm: EditCsoportForm: EditCsoportForm: EditCsoportForm: EditCsoportForm: EditCsoportForm: Header fájlok beillesztéseHeader fájlok beillesztése
1
2
A slotPrimeUpdate() slot deklarációs és definíciós részében is hivatkozunk a QSqlRecord osztályra.
3
class QSqlRecord;. . .public slots:void slotPrimeUpdate(QSqlRecord* buffer). . .
#include <qsqlrecord.h>. .void slotPrimeUpdate(QSqlRecord* buffer) {
}
editcsoportform.h
editcsoportform.cpp
104
EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: EditCsoportForm:: slotGyakvezChanged()slotGyakvezChanged()
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: ComboBoxGyakvezsignal: activated(const QString &)receiver: EditCsoportFormslot: slotGyakvezChanged(const QString &)
Edit/Slots/New Function/implementáció begépelése
Ha új gyakorlatvezet t őválasztottunk, akkor a névhez
tartozó gyakvez_id-t kell megjeleníteni a vezérl n.ő
105
VégeVégeVégeVégeVégeVégeVégeVégeVégeVége
106
FelevDataTable(QDataTable)
primeInsert()beforeUpdate()
currentChanged()beforeInsert()
CsoportDataTable(QDataTable)
primeInsert()cursorChanged()
EditPushButton(QPushButton)
clicked()
QuitPushButton(QPushButton)
clicked()
CsoportRegistrationForm(QDialog)
slotPrimeInsertFelev()slotBeforeUpdateFelev()
slotCurrentChangedFelev()newCurrentFelev()
slotPrimeInsertCsoport()slotCursorChangedCsoport()
editClicked()
accept()
init()
EditCsoportForm(QDialog)
slotFelevId()slotPrimeInsert()
slotPrimeUpdate()slotGyakvezChanged()
init()
felevId()
int _felev_id;
A projekt osztálydiagramja -1
107
EditCsoportForm(QDialog)
slotFelevId()slotPrimeInsert()
slotPrimeUpdate()slotGyakvezChanged()
init()
felevId()
int _felev_id;
CsoportDataBrowser(QDataBrowser)
primeInsert()primeUpdate()
init()
LabelKezdet(QLabel)
LabelSzint(QLabel)
ComboBoxGyakvez(QComboBox)
QLineEditNev(QLineEdit)
QSpinBoxMax(QSpinBox)
QSpinBoxGyakvez_id(QSpinBox)
PushButtonFirst(QPushButtonl)
PushButtonClose(QPushButton)
CsoportRegistrationForm(QDialog)
A projekt osztálydiagramja -2
108
FelevDataTable(QDataTable)
primeInsert()beforeUpdate()beforeInsert()
currentChanged()
CsoportDataTable(QDataTable)
primeInsert()cursorChanged()
EditPushButton(QPushButton)
clicked()
QuitPushButton(QPushButton)
clicked()
CsoportRegistrationForm(QDialog)
slotPrimeInsertFelev()slotBeforeUpdateFelev()
slotCurrentChangedFelev()newCurrentFelev()
slotPrimeInsertCsoport()slotCursorChangedCsoport()
editClicked()
accept()
init()
EditCsoportForm(QDialog)
setFelevId()slotPrimeInsert()
slotPrimeUpdate()slotGyakvezChanged()
init()
felevId()
int _felev_id;
Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1Signálok és slotok - 1
editClicked()dialog->setSqlCursor()dialog->setFilter()dialog->setSort()dialog->setFelevId()
109
EditCsoportForm(QDialog)
setFelevId()slotPrimeInsert()
slotPrimeUpdate()slotGyakvezChanged()
init()
felevId()
int _felev_id;
CsoportDataBrowser(QDataBrowser)
primeInsert()primeUpdate()
init()
LabelKezdet(QLabel)
LabelSzint(QLabel)
ComboBoxGyakvez(QComboBox)
QLineEditNev(QLineEdit)
QSpinBoxMax(QSpinBox)
QSpinBoxGyakvez_id(QSpinBox)
activated()
PushButtonFirst(QPushButtonl)
PushButtonClose(QPushButton)
setFelevId()LabelSzint->setText()LabelKezdet->setText()
Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2Signálok és slotok - 2