ˇ ´ vysoke ´ uc ˇen´ı technicke ´ v Praze Cesk e Fakulta stavebn´ı
Semestr´ aln´ı projekt letn´ı semestr 2009
Softwarov´ y semin´ aˇ r 1 (YSS1) Katedra mapov´ an´ı a kartografie
Grafick´ e rozhran´ı pro GNU Sqltutor
ˇ ıdov´ Autoˇ ri: Zora Hoˇ rejˇ sov´ a, Adam Pol´ıvka, Kateˇ rina Sm´ a
Obsah 1 Zad´ an´ı
3
´ 2 Uvod 2.1 Instalace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3 3
3 Projekt 3.1 Pr´ace v t´ ymu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Source code management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 4 4
4 Struktura aplikace 4.1 Dvojjazyˇcnost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 5
5 Datov´ e struktury a algoritmy 5.1 Grafick´a ˇc´ast . . . . . . . . . . . 5.1.1 Class AnswerResultWidget 5.1.2 Class MainWindow . . . . 5.1.3 Class OptionsDialog . . . 5.1.4 Class ResultsForm . . . . 5.1.5 Class TableViewForm . . . 5.1.6 Class TableWidget . . . . 5.2 Negrafick´a ˇc´ast . . . . . . . . . . 5.2.1 Class Options . . . . . . . 5.2.2 Class Permutation . . . . 5.2.3 Class Question . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
6 6 6 7 8 9 10 10 11 11 12 12
6 Z´ avˇ er
13
A UML diagramy
14
1
Zad´ an´ı
Navrhnˇete a naprogramujte grafick´e rozhran´ı pro aplikaci GNU Sqltutor pomoc´ı knihovny Qt 4.5.
´ Uvod
2
Webov´a aplikace GNU Sqltutor je v´ yukov´ y program SQL (strukturovan´ y dotazovac´ı jazyk) od ˇ Prof. Ing. Aleˇse Cepka, CSc., pouˇz´ıvan´ y pˇri samostudiu a z´avereˇcn´em testov´an´ı student˚ u pˇredmˇetu ˇ Datab´azov´e syst´emy na Stavebn´ı fakultˇe CVUT v Praze. Vzhledem k tomu, ˇze je volnˇe pˇr´ıstupn´ y na adrese http://sqltutor.fsv.cvut.cz/cgi-bin/sqltutor, m˚ uˇze ho vyuˇz´ıvat kdokoliv i mimo uveden´ y pˇredmˇet a vysokou ˇskolu. ´ Ukolem projektu SQLTutor je tedy vytvoˇrit moˇznost pro uˇzivatele spouˇstˇet si aplikaci offline bez internetov´eho prohl´ıˇzeˇce, tedy bez nutnosti nainstalovat server Apache. Pˇretrv´av´a poˇzadavek nainstalovan´e datab´aze a jej´ı naplnˇen´ı daty, ale i to by se mohlo v budoucnu zmˇenit, kdy by se mohla pouˇz´ıvat datab´aze na serveru josef.fsv.cvut.cz (tedy datab´aze pouˇz´ıvan´a webovou verz´ı GNU Sqltutor), ˇc´ımˇz by opˇet vznikla onlineov´a aplikace.
2.1
Instalace
Vlastn´ı aplikace nevyˇzaduje instalaci a rovnou se spouˇst´ı. Co je ale potˇreba nainstalovat je datab´azov´a ˇc´ast a n´aslednˇe ji naplnit daty. Pr˚ ubˇeh instalace bude pops´an pro linuxov´e distribuce pouˇz´ıvaj´ıc´ı bal´ıˇckovac´ı syst´em APT.
Instalace datab´azov´eho syst´emu PostgreSQL: apt-get install postgresql postgresql-client Vytvoˇren´ı datab´aze a potˇrebn´ ych uˇzivatel˚ u: su su - postgres createdb sqltutor createuser -D -R -S sqlquiz psql -c "ALTER USER sqlquiz WITH PASSWORD ’sqlkrok’;" createuser -d -r -S sqlexec psql -c "ALTER USER sqlexec WITH PASSWORD ’sqlkrok’;" psql sqltutor -c "CREATE LANGUAGE
plpgsql;"
Pro plnˇen´ı datab´aze je potˇreba vytvoˇrit uˇzivatele s pˇr´ısluˇsn´ ymi pr´avy, kter´ y m´a dostateˇcn´a pr´ava i v operaˇcn´ım syst´emu. Napˇr.:
createuser -r -d -s root Vlastn´ı data se z´ıskaj´ı s aplikac´ı GNU Sqltutor: apt-get install cvs cvs -d:pserver:
[email protected]:/sources/sqltutor co sqltutor Naplnˇen´ı datab´aze: cd sqltutor/ ./configure cd database/ make install cd ../datasets/ make install cd ../tutorials/ make install Tento postup napln´ı datab´azi aniˇz by se musel kompilovat cgi-script, avˇsak aby u ´spˇeˇsnˇe dobˇehl configure, mus´ı b´ yt nainstalovan´e knihovny pro kompilaci. Pokud se provede trojice krok˚ u ./configure, make, make install, datab´aze se napln´ı tak´e, ale kv˚ uli kompilaci to potrv´a o chvilku d´ele.
3 3.1
Projekt Pr´ ace v t´ ymu
Na projektu se pracovalo ve tˇr´ıˇclen´em t´ ymu pod veden´ım Zory Hoˇrejˇsov´e (pravila skromnˇe). Vzhledem k faktu, ˇze prakticky stejn´a aplikace jiˇz existovala, tud´ıˇz bylo pˇredem jasn´e co bude naˇse aplikace umˇet a jak bude pˇribliˇznˇe vypadat, nebylo nutn´e poˇr´adat ˇz´adn´e meetings a veˇsker´a komunikace prob´ıhala pˇre ICQ nebo e-mail. Pr´ace nebyla nijak pˇredem rozdˇelena, a kaˇzd´ y dˇelal co bylo potˇreba. Pˇri psan´ı k´odu se ale pr´ace oddˇelovala a kaˇzd´ y pracoval na samostan´e ˇc´asti aplikace, a o svou ˇc´ast se dann´ y ˇclen t´ ymu staral aˇz do ukonˇcen´ı v´ yvoje.
3.2
Source code management
V´ yvoj aplikace v t´ ymu se neobejde bez verzovac´ıho syst´emu, kter´ y znaˇcnˇe usnadˇ nuje spojov´an´ı ˇc´ast´ı k´odu od jednotliv´ ych v´ yvoj´aˇr˚ u a jejich aktualizaci. Z´aroveˇ n tento syst´em slouˇz´ı jako z´alohov´an´ı dat. Z nˇekolika moˇzn´ ych verzovac´ıch syst´em˚ u jsme zvolili Subversion, jelikoˇz jsme s jeho pouˇz´ıv´an´ım jiˇz mˇeli urˇcit´e zkuˇsenosti. Pro hosting naˇseho projektu jsme zvolili produkt spoleˇcnosti Sun Microsystems - Kenai (http://kenai.com). Str´anky projektu jsou ke shl´ednut´ı na adrese http://kenai.com/projects/sqltutor/, kde je tak´e zobrazeno url pro checkout repositoˇre, nebo je zde moˇzn´e st´ahnout pouze aplikaci samotnou. K nahl´ednut´ı je zde tak´e anglick´ y manu´al k aplikaci: http://sqltutor.kenai.com.
4
Struktura aplikace
Jak uˇz bylo naps´ano v´ yˇse, pˇribliˇzn´a struktura aplikace byla zn´ama pˇredem d´ıky existuj´ıc´ı v z´akladˇe stejn´e aplikace GNU Sqltutor. Pˇresto jsme sp´ıˇse pro zaj´ımavost vytvoˇrili dva UML diagramy, pˇriloˇzen´e na konci dokumentu. Aplikace se zkl´ad´a ze tˇrech z´akladn´ıch ˇc´ast´ı, kter´e odpov´ıdaj´ı tˇrem okn˚ um. Jsou to OptionsDialog -u ´vodn´ı okno s nastaven´ım testu, MainWindow - okno zobrazuj´ıc´ı testovac´ı ot´azky a ResultsForm - okno zobrazuj´ıc´ı v´ ysledky testu. Mimo zobrazov´an´ı obsahu se kaˇzd´e okno star´a i o datab´azovou ˇc´ast aplikace, but’ pˇr´ımo vol´an´ım SQL dotaz˚ u nebo nepˇr´ımo vol´an´ım metod jin´ ych objekt˚ u. Mezi tyto akce patˇr´ı napˇr´ıklad otev´ır´an´ı a zav´ır´an´ı session, ukl´ad´an´ı informac´ı o zodpovˇezen´e ot´azce ˇci naˇc´ıt´an´ı dalˇs´ı ot´azku. Zm´ınˇen´e objekty jsou instancemi pouze p´ar tˇr´ıd, jako je Options - sd´ılen´a vˇsemi okny, Permutation, kter´a byla pˇrevzata z p˚ uvodn´ı cgi-aplikace GNU Sqltutor, nebo Question. Nˇekter´e objekty jako jsou OptionsDialog a MainWindow se vytv´aˇrej´ı jiˇz ve funkci main, jelikoˇz mezi sebou mus´ı komunikovat. Veˇsker´a komunikace je obstar´ana pomoc´ı sign´al˚ u a slot˚ u a vlastnˇe se omezuje pouze na otev´ır´an´ı konkr´etn´ıch oken: //Ukonceni aplikace instanci tridy OptionsDialog QObject::connect(optionsDialog, SIGNAL(quitApplication()), qApplication, SLOT(quit())); //Ukonceni aplikace instanci tridy MainWindow QObject::connect(mainWindow, SIGNAL(quitApplication()), qApplication, SLOT(quit())); //Zobrazeni MainWindow z objektu OptionsDialog QObject::connect(optionsDialog, SIGNAL(showMainWindow()), mainWindow, SLOT(showAndSetUp())); //Zobrazeni OptionsDialog z objektu MainWindow QObject::connect(mainWindow, SIGNAL(showOptionsDialog()), optionsDialog, SLOT(show())); Ve funkci main se tak´e otev´ıraj´ı spojen´ı s datab´az´ı, pokud ne´ uspˇeˇsnˇe, aplikace se po ozn´amen´ı chyby uˇzivateli ihned ukonˇc´ı.
4.1
Dvojjazyˇ cnost
P˚ uvodn´ı aplikace komunikovala s uˇzivatelem pomoc´ı angliˇctiny, ale d´ıky velk´emu nadˇsen´ı Adama Pol´ıvky byla pˇreloˇzena tak´e do ˇceˇstiny a uˇzivateli je nyn´ı nab´ıdnut v´ ybˇer ze dvou jazyk˚ u. Pˇrekl´ad´an´ı qt aplikace je velice jednoduch´e d´ıky programu Qt Linguist, kter´ y nahrazuje editaci XML soubor˚ u. Aby bylo moˇzn´e mˇenit jazyk, je nutn´e um´ıstit vˇsechny ˇretˇezce(u kter´ ych je zmˇena jazyku poˇzadov´ana) ych XML soudo funkce tr(). Do souboru nazev projektu.pro se pˇridaj´ı poˇzadovan´e n´azvy jazykov´ bor˚ u:
TRANSLATIONS = languages/SQLTutorGUI_cs.ts \ languages/SQLTutorGUI_en.ts Aby se tyto soubory vytvoˇrili, spust´ı se pˇr´ıkaz lupdate nazev_projektu.pro Vytvoˇren´e soubory je moˇzno editovat pˇr´ımo, jelikoˇz jde o obyˇcejn´e XML. Pohodlnˇejˇs´ı ale je pouˇz´ıt sw Qt Linguist. Po dokonˇcen´ı pˇrekladu je jeˇstˇe nutn´e .ts soubory zkompilovat but’ pˇr´ımo v programu Linguist funkc´ı Release nebo pˇr´ıkazem lrelease v pˇr´ıkazov´e ˇr´adce. V k´odu se pak zmˇena jazyka oˇsetˇruje n´asledovnˇe: QTranslator *translator = new QTranslator(); //zjisteni jazyka podle systemoveho locale QString lang = QLocale().system().name().section("_",0,0); //nastaveni jazyka if(translator->load("languages/SQLTutorGUI_" + lang)){ qApplication->installTranslator(translator); }
5
Datov´ e struktury a algoritmy
Aplikace nebyla nijak algoritmicky n´aroˇcn´a, tud´ıˇz zde budou zm´ınˇeny pouze tˇr´ıdy. Kompletn´ı zrdojov´e k´ody s projektem pro Qt Creator jsou ke staˇzen´ı na str´ank´ach projektu http://kenai.com/projects/sqltutor/downloads/download/SQLTutor_src.zip, nebo je moˇzn´ y checkout repositoˇre https://kenai.com/svn/sqltutor~svn, kde ale nemus´ı b´ yt stabiln´ı verze.
5.1
Grafick´ aˇ c´ ast
5.1.1
Class AnswerResultWidget
Jedn´a se o widget obashuj´ıc´ı informace o testov´e ot´azce a odpovˇedi uˇzivatele. Pouˇz´ıv´a se v ResultsForm v zobrazen´ı seznamu ot´azek. class AnswerResultWidget : public QWidget { Q_OBJECT public: AnswerResultWidget(QSqlDatabase *db, QWidget *parent = 0); ~AnswerResultWidget(); void showAndSetUp(Options *opt, QSqlRecord res); protected: void changeEvent(QEvent *e);
private: Ui::AnswerResultWidget *m_ui; QSqlDatabase *database; }; 5.1.2
Class MainWindow
Tato tˇr´ıda je hlavn´ım oknem aplikace, ve kter´em se odehr´av´a vlastn´ı testov´an´ı. Vˇetˇsina jej´ıch metod obsluhuje ud´alosti vyvolan´e uˇzivatelem a zobrazuje mu pˇr´ısluˇsn´a data. class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(Options *opt, QSqlDatabase *db, QSqlDatabase *dbExec, QWidget *parent = 0); ~MainWindow(); //centruje widget do stredu plochy void centerPosition(QWidget *widget); void newTest(); //otevre web browser s napovedou static void showManual(); protected: void closeEvent(QCloseEvent *event); void changeEvent(QEvent *e); private: Ui::MainWindowClass *ui; //spojeni s databazi, pouze pro cteni QSqlDatabase *database; //spojeni s databazi, pro zapis QSqlDatabase *databaseExec; //nastaveni aktualniho testu Options *options; //okno pro zobrazovani db tabulek TableViewForm tableViewForm; //okno pro zobrazeni vysledku ResultsForm resultsForm; //poradove cislo aktualni otazky int numberQuestion; //pocet spravne zodpovezenych otazek int correctAnswers; //prubezny ziskany pocet bodu int points;
//zda byly jiz body pripocteny do promenne points (na jednu otazku se totiz muze zodpov bool wasIncrementedResult; //retezec obsahujici informace o aktualnim nastaveni QString optionsString; //aktualni otazka Question question; void nextQuestion(); void finishTest(); void setUpStatusBar(); public slots: //zobrazi okno a nastavi widgety do zakladniho stavu (naplni je datama ...) void showAndSetUp(); private slots: void on_manualPushButton_clicked(); void on_finishPushButton_clicked(); void on_executePushButton_clicked(); void on_helpPushButton_clicked(); void on_nextQuestionPushButton_clicked(); void on_datasetTableWidget_doubleClicked(const QModelIndex & index); signals: void quitApplication(); void showOptionsDialog(); }; 5.1.3
Class OptionsDialog
Dialog zobrazuj´ıc´ı se vˇzdy na zaˇc´atku kaˇzd´eho testu. Slouˇz´ı k nastaven´ı n´asleduj´ıc´ıho testu a z´aroveˇ n uˇzivateli nab´ız´ı zmˇenu jazyka. Pˇri odsouhlasen´ı tohoto dialogu se otev´ır´a nov´a session pomoc´ı vol´an´ı metody setOptions objektu Options. class OptionsDialog : public QDialog { Q_OBJECT public: OptionsDialog(QApplication *a, QSqlDatabase *db, Options *opt, QWidget *parent = 0); ~OptionsDialog(); protected: void changeEvent(QEvent *e); private: Ui::OptionsDialog *m_ui; void setUp(); void fillTutorialComboBox(QSqlDatabase *db); void fillDatasetComboBox(QSqlDatabase *db);
void fillPointsLineEdits(QSqlDatabase *db); void fillLanguageComboBox(); // nastavi jazyk podle systemu void setLanguageByLocale(); Options *options; QSqlDatabase *database; TableViewForm tableViewForm; QApplication *application; QTranslator *translator; QString currentLanguage; private slots: void on_manualPushButton_clicked(); void on_quitButton_clicked(); void on_okButton_clicked(); void on_datasetsPushButton_clicked(); void on_tutorialComboBox_currentIndexChanged(int index); void on_languageComboBox_currentIndexChanged(int index); void on_minPointsSpinBox_valueChanged(int min); void on_maxPointsSpinBox_valueChanged(int max); signals: void quitApplication(); void showMainWindow(); void showLanguageDialog(); }; 5.1.4
Class ResultsForm
Okno zobrazuj´ıc´ı celkov´ y v´ ysledek probˇehnut´eho testu, spolu s nastaven´ım a seznamem vˇsech pouˇzit´ ych ot´azek s odpovˇed’mi. Vol´an´ım metody closeSession tˇr´ıdy Options se zav´ır´a otevˇren´a session. Uˇzivatel zde m´a moˇznost pˇrej´ıt na OptionsDialog a t´ım spustit nov´ y test. class ResultsForm : public QWidget { Q_OBJECT public: ResultsForm(QSqlDatabase *db, QMainWindow *mw, QWidget *parent = 0); ~ResultsForm(); void showAndSetUp(Options *opt); protected: void changeEvent(QEvent *e); void closeEvent(QCloseEvent *event); private:
Ui::ResultsForm *m_ui; QSqlDatabase *database; Options *options; QMainWindow *mainWindow; void fillResults(QSqlDatabase *db); void fillAnswers(QSqlDatabase *db); private slots: void on_newTestPushButton_clicked(); }; 5.1.5
Class TableViewForm
Jednoduch´ y widget obsahuj´ıc´ı pouze tabulku ve formˇe QTableView. Okno slouˇz´ı ke zobrazen´ı urˇcit´e tabulky, kter´a je mu pˇred´av´ana v podobˇe instance tˇr´ıdy QSqlQueryModel. class TableViewForm : public QWidget { Q_OBJECT public: TableViewForm(QWidget *parent = 0); ~TableViewForm(); void fillTable(QSqlDatabase &db, QString select); protected: void changeEvent(QEvent *e); private: Ui::TableViewForm *m_ui; QSqlQueryModel *model; }; 5.1.6
Class TableWidget
Pomocn´ y widget slouˇz´ıc´ı k zobrazen´ı seznamu tabulek pro dannou ot´azku. class TableWidget : public QTableWidget { Q_OBJECT public: TableWidget(QWidget *parent = 0); ~TableWidget(){} //vyplni se seznamem tabulek a vrati zneni otazky QString fill(QSqlDatabase *db, int tutorialId, int questionId ); private:
};
5.2
Negrafick´ aˇ c´ ast
5.2.1
Class Options
Tˇr´ıda se pouˇz´ıv´a jako u ´loˇziˇstˇe aktu´aln´ıho nastaven´ı. Z´aroveˇ n m´a metody pro otev´ır´an´ı a zav´ır´an´ı aktu´aln´ı session. class Options { public: Options(QSqlDatabase *db): database(db){set = false;} Options(int minMin, int maxMax); //setters bool setOptions(int tutorial, int min, int max, bool help, QString dataset); //nastavi povolene hodnoty min a max promennych void setMinMax(int min, int max){minMinPoints = min; maxMaxPoints = max; set = false;} //getters bool isSet(){return set;} int getTutorial(){return tutorial;} int getMinPoints(){return minPoints;} int getMaxPoints(){return maxPoints;} bool isHelp(){return help;} QString getDataset(){return dataset;} int getSession(){return session;} QString getHash(){return hash;} //zavre aktualni session (v db) void closeSession(); private: //promenne nastaveni int tutorial; int minPoints; int maxPoints; bool help; QString dataset; //pomocne promenne bool set; int minMinPoints; int maxMaxPoints; QSqlDatabase *database;
//otevre novou session (v db) bool openSession(); //id aktualni session int session; QString hash; }; 5.2.2
Class Permutation
Tato tˇr´ıda je pˇrevzata z p˚ uvodn´ı aplikace GNU Sqltutor a pouˇz´ıv´a se pˇri kontrole spr´avnosti odpovˇedi. Tˇr´ıda vytv´aˇr´ı vˇsechny moˇzn´e kombinace poˇrad´ı sloupc˚ u v´ ysledn´e tabulky pro dannou ot´azku. Tyto kombinace se pot´e ve tˇr´ıdˇe Question porovn´avaj´ı se spr´avn´ ym v´ ysledkem dokud se nenalezne shoda nebo se nevyˇcerpaj´ı vˇsechny kombinace. class Permutation { public: Permutation() : N(0),avail(0),total(0){}; Permutation(int k){reset(k);}; void next(); void reset(int size); int int bool int&
size() const {return perms() const {return empty() const {return operator[](int i){return
N;}; total;}; avail == 0;}; perm[i];};
private: int N; QVector
perm; int avail; int total; }; 5.2.3
Class Question
Tˇr´ıda uchov´avaj´ıc´ı informace o aktu´aln´ı ot´azce. Kontroluje spr´avnost odpovˇedi a odpovˇed’ ukl´ad´a do datab´aze. class Question { public: Question(Options *opt, QSqlDatabase *db, QSqlDatabase *dbExec); //Vrati-li plpgsql funkce nextQuestion dosud nezadanou otazku odpovidajici nastaveni, //nastavi promenne nove otazky a vrati true. Neexistuje-li takova otazka, vrati false. bool next();
//zkontroluje odpoved a vrati vysledek kontroly bool checkAnswer(const QString& userAnswer); int getId(){return questionId;}; QString getQuestionText(){return questionText;}; QString getDataset(){return dataset;}; int getPoints(){return points;}; QString getTutorAnswer(){return tutorAnswer;}; QString getMessage(){return message;}; private: Options* options; QSqlDatabase* database; QSqlDatabase* databaseExec;
// ulozi odpoved do databaze, nastavi zpravu o vysledku kontroly a vrati hodnotu correc bool saveAnswer(const bool& correct,const QString& answer,const QString& msg); // pomocna fce na odstraneni stredniku z konce dotazu QString semicolumn(const QString & query); //zprava o vysledku kontroly spravnosti QString message; int tutorialId; int questionId; QString dataset; // bodove ohodnoceni otazky int points; // text otazky QString questionText; // spravna odpoved QString tutorAnswer; };
6
Z´ avˇ er
V´ ysledkem toho projektu je jednoduch´a Qt aplikace, kter´a je grafick´ ym rozhran´ım datab´azov´e ˇc´asti webov´e aplikace GNU Sqltutor. Pˇri programov´an´ı aplikace jsme se sezn´amili hlavnˇe s SQL modulem knihovny Qt. Grafickou ˇc´ast knihovny jsme samozˇrejmˇe vyuˇz´ıvali ve velk´em mnoˇzstv´ı, ale d´ıky grafick´emu designeru, kter´ y je ned´ılnou souˇc´ast´ı Qt Creatoru, jde sp´ıˇse o klik´an´ı neˇz o psan´ı k´odu, coˇz nen´ı myˇsleno jako v´ ytka. Dalˇs´ı d˚ uleˇzitou ˇc´ast´ı Qt knihovny jsou sign´aly a sloty. Jejich v´ yhodu jsme naˇsli hlavnˇe ve faktu, ˇze se objekty navz´ajem v˚ ubec nemusej´ı zn´at a pˇresto spolu m˚ uˇzou komunikovat. Vzhledem k nevelk´e obs´ahlosti projektu jsme byli nuceni vyuˇz´ıt pouze velice malou ˇc´ast Qt knihovny, tud´ıˇz jsme porozumˇeli pouze zlomku. Nauˇcili jsme se ale zp˚ usob pr´ace s knihovnou, a tak by pronik´an´ı do dalˇs´ıch modul˚ u nemˇelo b´ yt sloˇzit´e.
A
UML diagramy Usecase Diagram
Sequence Diagram