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



Hasonló dokumentumok
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ú MDI alkalmazás: Számlakészítő program 2/3

Elemi alkalmazások fejlesztése III.

Adatok speciális megjelenítése

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

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

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

Budapest, március. ELTE Informatikai Kar

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

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

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

Elemi alkalmazások fejlesztése III

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

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

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

117. AA Megoldó Alfréd AA 117.

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

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

Körkörös listák. fej. utolsó. utolsó. fej

Eseménykezelés. Aszinkron kommunikáció

Elemi alkalmazások fejlesztése III

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

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

Adatbáziskezelés M/V architektúrában

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

INFORMATIKAI ALAPISMERETEK

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

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

Elemi alkalmazások fejlesztése III.

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

Elemi alkalmazások fejlesztése IV.

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

Géptermi zh-írás forgatókönyve

Származtatási mechanizmus a C++ nyelvben

Elemi alkalmazások fejlesztése III.

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

C# osztályok. Krizsán Zoltán

Programozás I gyakorlat. 5. Struktúrák

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

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

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Alkalmazások fejlesztése III. Qt 4 /C++ alapú grafikus alkalmazás - Memóriajáték 1/2

Programozás II gyakorlat. 8. Operátor túlterhelés

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Objektumorientált programozás C# nyelven

3. Gyakorlat Ismerkedés a Java nyelvvel

Objektumorientált programozás C# nyelven

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Objektumorientált programozás C# nyelven

Osztály és objektum fogalma

Információs Technológia

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

infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

Grafikus felhasználói felületek. Abstract Window Toolkit, a java.awt és java.awt.event csomagok

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

500. CC Megoldó Alfréd CC 500.

Programozás C++ -ban 2007/4

INFORMATIKAI ALAPISMERETEK

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

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Grafikus felületek készítése 1.

C++/Qt alapú SDI alkalmazás készítése II...2

Országzászlók (2015. május 27., Sz14)

Grafikus Felhasználói Felületű (GUI) program készítése a QT Creatorral, illetve a Microsoft Visual Studio-val

Események C#-ban Krizsán Zoltán iit

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Elemi alkalmazások fejlesztése III

Eseménykezelés. Aszinkron kommunikáció

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Bánsághi Anna

Elemi alkalmazások fejlesztése III

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

bool _freehand = false; QPoint _lastpoint; // ebben a pontban volt az utolsó rajzolásnál az egérmutató

Bevezetés a programozásba 2

Bevezetés a C++ programozásba

Bánsághi Anna

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Qt rajzolás munkafüzet. Elemi Alkalmazások fejlesztése 3.

OPERÁCIÓS RENDSZEREK 1. ÁTIRÁNYÍTÁSOK, SZŰRŐK

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

INFORMATIKAI ALAPISMERETEK

C# feladatok gyűjteménye

Tervminták a valósidejű gyakorlatban

Rekurzió. Horváth Gyula.

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

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

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

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

Dinamikus felületű alkalmazások. Stílusok, időzítő, képek

A készülék használata elõtt kérjük olvassa el figyelmesen a használati utasítást.

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Objektumorientált programozás C# nyelven III.

C++ programozási nyelv

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Biztonság java web alkalmazásokban

500. DD Megoldó Alfréd DD 500.

Átírás:

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása Készítette: Szabóné Nacsa Rozália nacsa@inf.elte.hu people.inf.elte.hu/nacsa/eaf4/ Qt 4 2007 1

Tartalom Alapértelmezett cellaszerkesztő lecserélése (buildingeditor_06) Saját cellaszerkesztő készítés (buildingeditor_07) Egy tábla, több nézet (buildingeditor_08) GUI felület futásidejű testreszabása (buildingeditor_09) 2

buildingeditor_06 createeditor() paint() seteditordata() setmodeldata() 3

Az App névtér #include <QStringList> namespace App QStringList shoretypes(); ; app.h #include <QStringList> #include "app.h" app.cpp QStringList App::shoreTypes() QStringList ret; ret << QObject::trUtf8("Homokos") << QObject::trUtf8("Kavicsos") << QObject::trUtf8("Sziklás") << QObject::trUtf8("Apró kavicsos") ; return ret; 4

Az alkalmazás osztálydiagramja 5

BuildingDelegate módosítása class BuildingDelegate : public QSqlRelationalDelegate Q_OBJECT buildingdelegate.h public: BuildingDelegate(int distancecolumn, int shorecolumn, QObject *parent = 0); void paint(qpainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QWidget *createeditor(qwidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void seteditordata(qwidget *editor, const QModelIndex &index) const; void setmodeldata(qwidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; private: int distancecolumn; int shorecolumn; ; 6

BuildingDelegate módosítása... #include "app.h" buildingdelegate.cpp BuildingDelegate::BuildingDelegate(int distancecolumn, int shorecolumn, QObject *parent) : QSqlRelationalDelegate(parent) this >distancecolumn = distancecolumn; this >shorecolumn = shorecolumn; 7

BuildingDelegate: paint(...) void BuildingDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const if(index.column() == distancecolumn)... else if(index.column() == shorecolumn) int i = index.model() >data(index,qt::displayrole).toint(); QString text = App::shoreTypes().at(i); QStyleOptionViewItem myoption = option; myoption.displayalignment = Qt::AlignCenter Qt::AlignVCenter; drawdisplay(painter,myoption,myoption.rect, text); drawfocus(painter, myoption, myoption.rect); buildingdelegate.cpp else QItemDelegate::paint(painter, option, index); 8

BuildingDelegate: createeditor(...) buildingdelegate.cpp QWidget *BuildingDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const if (index.column() == shorecolumn) QComboBox *shoreedit = new QComboBox(parent); shoreedit >additems(app::shoretypes()); return shoreedit; else return QSqlRelationalDelegate::createEditor(parent, option, index) ; 9

BuildingDelegate: seteditordata(), setmodeldata() void BuildingDelegate::setEditorData(QWidget *editor, buildingdelegate.cpp const QModelIndex &index) const if (index.column() == shorecolumn) int i = index.model() >data(index, Qt::DisplayRole).toInt(); QComboBox *shoreedit = qobject_cast<qcombobox *>(editor); shoreedit >setcurrentindex(i); else QSqlRelationalDelegate::setEditorData(editor, index); void BuildingDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const if (index.column() == shorecolumn) QComboBox *shoreedit = qobject_cast<qcombobox *>(editor); model >setdata(index, shoreedit >currentindex ()); else QSqlRelationalDelegate::setModelData(editor, model, index); 10

BuildingDelegate: setdefaultvalues(...) buildingdelegate.cpp void BuildingModel::setDefaultValues(int row) setdata(index(row, Column::Building_City),"Jesolo",Qt::DisplayRole); setdata(index(row, Column::Building_City),2, Qt::EditRole); //setdata(index(row, Column::Building_Shore),1); setdata(index(row, Column::Building_Shore),"kavicsos", Qt::DisplayRole); setdata(index(row, Column::Building_Shore),1, Qt::EditRole); setdata(index(row, Column::Building_Features),3); 11

BuildingTableView: delegáló lecserélése buildingdelegate.cpp BuildingTableView::BuildingTableView(QWidget* parent) : QTableView(parent) setselectionbehavior(qabstractitemview::selectitems); setcurrentrow( 1); setcurrentcolumn(column::building_name); //setitemdelegate(new QSqlRelationalDelegate(this)); //setitemdelegate(new BuildingDelegate(Column::Building_Sea_Distance,this)); setitemdelegate( new BuildingDelegate(Column::Building_Sea_Distance,Column::Building_Shore,this)); 12

Projekt leíró fájl módosítása buildingeditor.pro TEMPLATE = app TARGET = DEPENDPATH +=. INCLUDEPATH +=. QT += sql # Input HEADERS += buildingform.h buildingmodel.h buildingtableview.h connection.h generateid.h column.h buildingdelegate.h cityform.h app.h FORMS += buildingform.ui cityform.ui SOURCES += main.cpp buildingform.cpp buildingmodel.cpp buildingtableview.cpp buildingdelegate.cpp cityform.cpp app.cpp 13

Saját cellaszerkesztő készítése (buildingeditor_07) createeditor() paint() seteditordata() setmodeldata() CheckListView osztály 14

CheckListView osztály class CheckListView : public QWidget Q_OBJECT checklistview.h public: CheckListView(const QStringList &questions = QStringList(), int checksum=0, int columncount=1, QWidget *parent = 0); CheckListView(QWidget *parent = 0); void newchecklistview(const QStringList &questions, int checksum=0, int columncount=1); int getchecksum() return _checksum; QStringList questions() return _questions;... private: void createcheckboxes(); void removecheckboxes(); void init(); class QCheckBox; class QGridLayout; class QVBoxLayout; class QHBoxLayout; typedef QList<QCheckBox*> CheckBoxList; QStringList _questions; int _checksum; int _columncount; QLabel* label; QGridLayout *checkboxlayout; QVBoxLayout* vboxlayout; QHBoxLayout* hboxlayout; CheckBoxList checkboxlist; ; 15

CheckListView osztály class CheckListView : public QWidget Q_OBJECT checklistview.h public: CheckListView(const QStringList &questions = QStringList(), int checksum=0, int columncount=1, QWidget *parent = 0);... public slots: void setchecksum(int checksum); void setchecksum ( const QModelIndex & index); void setcolumncount(int columncount); QString tostring(); private slots: void updatecheckstates(); void updatechecksum(); void repaintcheckboxes(); protected: void closeevent ( QCloseEvent * event ); signals: void checksumchanged(); void columncountchanged(); void editingfinished();... ; 16

CheckListView osztály class CheckListView : public QWidget Q_OBJECT checklistview.h public: CheckListView(const QStringList &questions = QStringList(), int checksum=0, int columncount=1, QWidget *parent = 0);... public slots: void setchecksum(int checksum); void setchecksum ( const QModelIndex & index); void setcolumncount(int columncount); QString tostring(); private slots: void updatecheckstates(); void updatechecksum(); void repaintcheckboxes(); protected: void closeevent ( QCloseEvent * event ); signals: void checksumchanged(); void columncountchanged(); void editingfinished();... ; 17

CheckListView osztály: definíció CheckListView::CheckListView(QWidget *parent) : QWidget(parent),_questions(QStringList("")), _checksum(0), _columncount(1) init(); checklistview.cpp CheckListView::CheckListView(const QStringList &questions, int checksum, int columncount, QWidget *parent) : QWidget(parent), _questions(questions), _checksum(checksum), _columncount(columncount) init(); 18

CheckListView osztály void CheckListView::init() label = new QLabel(); checkboxlayout = new QGridLayout; vboxlayout = new QVBoxLayout();... checklistview.cpp vboxlayout >addwidget(label); vboxlayout >addlayout(checkboxlayout);... hboxlayout >additem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); hboxlayout >addlayout(vboxlayout); hboxlayout >additem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); setlayout(hboxlayout); connect(this, SIGNAL(checkSumChanged()), this, SLOT(updateCheckStates())); connect(this, SIGNAL(columnCountChanged()), this, SLOT(repaintCheckBoxes())); newchecklistview(_questions,_checksum,_columncount); 19

CheckListView osztály void CheckListView::newCheckListView(const QStringList &questions, int checksum, int columncount) _checksum = checksum; _questions = questions; _columncount = columncount; removecheckboxes(); createcheckboxes(); updatecheckstates(); 20

CheckListView osztály void CheckListView::createCheckBoxes( ) QCheckBox *checkbox; checklistview.cpp int k = 0; while (k < questions().size()) int i = (k/_columncount); int j = (k%_columncount); checkbox = new QCheckBox( questions().at(k),this ); checkbox >setobjectname("checkbox" + QString::number(i*_columnCount+j)); checkboxlayout >addwidget(checkbox,i,j); //Registers checkbox to checkboxlayout checkbox >show(); checkboxlist.append(checkbox); //Add checkbox to container connect(checkbox, SIGNAL(stateChanged (int)), this, SLOT(updateCheckSum())); ++k; 21

CheckListView osztály void CheckListView::updateCheckStates() int sum = _checksum; for (int i = 0; i < checkboxlist.size(); ++i) checkboxlist.at(i) >setchecked(sum % 2); sum = sum/2; checklistview.cpp void CheckListView::updateCheckSum() int mychecksum = 0; int base = 1; for (int i = 0; i < checkboxlist.size(); ++i) if (checkboxlist.at(i) >ischecked () ) mychecksum = mychecksum + base; base = base*2; setchecksum(mychecksum); 22

createeditor() paint() seteditordata() setmodeldata() createeditor() paint() seteditordata() setmodeldata() 23

BuildingDelegate: definíció kiegészítése class BuildingDelegate : public QSqlRelationalDelegate Q_OBJECT public: BuildingDelegate(int distancecolumn, int shorecolumn, int featurecolumn, QObject *parent = 0);... private slots: void commitandcloseeditor(); private: int distancecolumn; int shorecolumn; int featurecolumn; ; 24

BuildingDelegate: implementáció kiegészítése BuildingDelegate::BuildingDelegate(int distancecolumn, int shorecolumn, int featurecolumn, QObject *parent) : QSqlRelationalDelegate(parent) this >distancecolumn = distancecolumn; this >shorecolumn = shorecolumn; this >featurecolumn = featurecolumn; 25

BuildingDelegate: implementáció kiegészítése void BuildingDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const if(index.column() == distancecolumn)... else if(index.column() == shorecolumn)... else if(index.column() == featurecolumn) QString text = QString::number(index.model() >data(index,qt::displayrole).toint(),2); QStyleOptionViewItem myoption = option; myoption.displayalignment = Qt::AlignRight Qt::AlignVCenter; drawdisplay(painter,myoption,myoption.rect, text); drawfocus(painter, myoption, myoption.rect); buildingdelegate.cpp else QItemDelegate::paint(painter, option, index); 26

BuildingDelegate: implementáció kiegészítése QWidget *BuildingDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const buildingdelegate.cpp if (index.column() == shorecolumn)... else if (index.column() == featurecolumn) CheckListView* checklistviewedit = new CheckListView(0); checklistviewedit >newchecklistview(app::buildingfeatures(),0,1); checklistviewedit >setwindowtitle(trutf8("edit Features")); checklistviewedit >setwindowflags(qt::subwindow); QModelIndex myindex = index.model() >index(index.row(),1); QString text = index.model() >data(myindex,qt::displayrole).tostring(); checklistviewedit >setlabel(text); connect(checklistviewedit, SIGNAL(editingFinished()), this, SLOT(commitAndCloseEditor())); return checklistviewedit; else return QSqlRelationalDelegate::createEditor(parent, option, index) ; 27

BuildingDelegate: implementáció kiegészítése void BuildingDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const if (index.column() == shorecolumn)... else if (index.column() == featurecolumn) int checksum = index.model() >data(index, Qt::DisplayRole).toInt(); CheckListView *featureedit = qobject_cast<checklistview *>(editor); featureedit >setchecksum(checksum); buildingdelegate.cpp else QSqlRelationalDelegate::setEditorData(editor, index); 28

BuildingDelegate: implementáció kiegészítése void BuildingDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const if (index.column() == shorecolumn)... buildingdelegate.cpp else if (index.column() == featurecolumn) CheckListView *featureedit = qobject_cast<checklistview *>(editor); int checksum = featureedit >checksum(); model >setdata(index, checksum); else QSqlRelationalDelegate::setModelData(editor, model, index); 29

BuildingDelegate: implementáció kiegészítése void BuildingDelegate::commitAndCloseEditor() CheckListView *editor = qobject_cast<checklistview *>(sender()); emit commitdata(editor); emit closeeditor(editor); buildingdelegate.cpp 30

BuildingTableView módosítása buildingdelegate.cpp BuildingTableView::BuildingTableView(QWidget* parent) : QTableView(parent) setitemdelegate(new BuildingDelegate(Column::Building_Sea_Distance, Column::Building_Shore,Column::Building_Features,this)); setselectionbehavior(qabstractitemview::selectitems); setcurrentrow( 1); setcurrentcolumn(column::building_name); 31

Egy tábla, több nézet (buildingeditor_08) 32

Felületterv módosítása Típus Név(objectName) Beállítások, megjegyzés QWidget BuildingForm windowtitle: Edit Buildings QTableView tableview QPushButton addbutton text = &Add QPushButton deletebutton text = &Delete QPushButton quitbutton text = &Quit QPushButton editcitybutton text = &Edit City QPushButton nextbutton text = &Next QPushButton prevbutton text = &Prev CheckListView checklistview Promote Widget (checklistview.h) 33

buildingform.h class BuildingForm : public QDialog, public Ui_BuildingForm... private slots:... void on_prevbutton_clicked(); void on_nextbutton_clicked(); ; void slotdatachanged ( const QModelIndex & topleft, const QModelIndex & bottomright ); void displayfeatures(int row); 34

BuildingForm::BuildingForm(const QString &name, QWidget *parent) : QDialog(parent) buildingform.cpp setupui(this); buildingmodel = new BuildingModel(); buildingtableview >setmodel(buildingmodel); buildingtableview >init(); checklistview >newchecklistview(app::buildingfeatures(),0,1); checklistview >setenabled(false); connect(buildingmodel, SIGNAL(rowCountChanged()), buildingtableview, SLOT(updateSelection())); connect(buildingmodel, SIGNAL(dataChanged ( const QModelIndex &, const QModelIndex & )), this, SLOT(slotDataChanged ( const QModelIndex &, const QModelIndex & ))); connect(buildingtableview,signal(currentrowchanged(int)),this,slot(displayfeatures(int))); buildingmodel >select(); buildingtableview >resizecolumnstocontents(); buildingtableview >setselection(name,buildingtableview >currentcolumn()); 35

void BuildingForm::slotDataChanged ( const QModelIndex & topleft, const QModelIndex & bottomright ) Q_UNUSED(bottomRight); if(topleft.column()!= Column::Building_Features) return; checklistview >setchecksum(topleft.model() >data(topleft).toint()); checklistview >setfocus(); buildingform.cpp 36

void BuildingForm::displayFeatures(int row) if(row < 0 row >= buildingmodel >rowcount() ) return; buildingform.cpp QModelIndex index; index = buildingmodel >index(row,column::building_name); if(!index.isvalid())return; checklistview >setlabel("available features in " + buildingmodel >data(buildingmodel > index(row,column::building_name),qt::displayrole).tostring()); index = buildingmodel >index(row,column::building_features); if(!index.isvalid()) return; checklistview >setchecksum(buildingmodel >data(index,qt::displayrole).toint()); 37

Alkalmazás futásidejű testreszabása (buildingeditor_09) 38

A bemutatott programok megtalálhatók a people.inf.elte.nacsa/qt4/eaf4/ címen. 39