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

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

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

Elemi alkalmazások fejlesztése III. A Qt assistant elindítása. Ajánlott ir odalom. A Qt assistant nyitó ablaka

Elemi alkalmazások fejlesztése III

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

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

Elemi alkalmazások fejlesztése IV. Adatbáziskezelő alkalmazás készítése C++/Qt ben I.

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III

Elemi alkalmazások fejlesztése III.

Elemi alkalmazások fejlesztése III.

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

Adatbázis-kezelés ODBC driverrel

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

Adatbázis-kezelés ActiveX vezérl kkel 2.rész

Budapest, március. ELTE Informatikai Kar

Elemi alkalmazások fejlesztése III.

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

Adatbázis-kezelés ODBC-vel

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

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelés ActiveX vezérlıkkel - 1

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

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

Adatbázis-kezelés API hívásokkal. Adatbázis-kezelés ODBC-vel. Adatbázis-kezelés SQL parancsokkal. Adatbázis-kezelés ODBC-vel.

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

Eseményvezérelt alkalmazások

Könyvtári nyilvántartás

Elemi alkalmazások fejlesztése I.

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

Elemi alkalmazások fejlesztése III.

Készítette: Szabóné Nacsa Rozália

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelés ActiveX vezérl ı kkel - 2

Elemi adatbázis kezelés

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

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

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

SDI ALKALMAZÁS I. Workspace / ResourceView / Toolbar / IDR_MAINFRAME. Workspace / ResourceView / Menu / IDR_MAINFRAME

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Adatbázis-kezelés elemi eszközökkel. Giachetta Roberto

Adatok speciális megjelenítése

C#---Access adatbáziskezelési gyakorlat

Adatbázis-kezelés ActiveX vezérl kkel

Adatbázis kezelés Delphiben. SQL lekérdezések

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

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Adatbázisok webalkalmazásokban

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Adatkezelés speciális eszközökkel. Giachetta Roberto

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Thermo1 Graph. Felhasználói segédlet

Az SQL*Plus használata

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

Entity Framework + LINQ oktatási segédlet

Elemi alkalmazások fejlesztése IV.

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés elemi eszközökkel. A MySQL adatbázis-kezelő

Szerző. Varga Péter ETR azonosító: VAPQAAI.ELTE cím: Név: Kurzuskód:

A jobboldalon a pnlright egy Stacked Widget Állítsuk be az első lapot és nevezzük el pnldraw-ra:

Elemi alkalmazások fejlesztése III

Adatbázis Rendszerek II. 2. Gyakorló környezet

3. Osztályok II. Programozás II

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

ADATBÁZISKEZELÉS KÖZVETLEN ELÉRÉSSEL II...2

Eseménykezelés. Aszinkron kommunikáció

SQLTools in 5 steps ver. 0.1

Programozási technológia

Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

Egészítsük ki a Drupal-t. Drupal modul fejlesztés

Elemi alkalmazások fejlesztése III

C#, OOP. Osztályok tervezése C#-ban

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

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

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

Webszolgáltatás és XML alapú adatbázis. 1. Az adatbázis megtervezése

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

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

LBRA6i integrált rendszer

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

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

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

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

Adatbázis Rendszerek II. 2. Ea: Gyakorló környezet

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

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

Adatelemzés SAS Enterprise Guide használatával. Soltész Gábor solteszgabee[at]gmail.com

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

Mobil informatika gyakorlat. 2. óra: NFC a gyakorlatban

munkafüzet open eseményéhez

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

SQL ALAPOK. Bevezetés A MYSQL szintaxisa Táblák, adatok kezelésének alapjai

Adatbázisok* tulajdonságai

1. Gyakorlat: Telepítés: Windows Server 2008 R2 Enterprise, Core, Windows 7

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Egyszerű alkalmazás fejlesztése JDeveloperben

Adatbázis-lekérdezés. Az SQL nyelv. Makány György

OKTATÓANYAG. Cseh Péter. Webes alkalmazás készítése JDeveloper segítségével CSPOAAI.ELTE

Átírás:

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