Wiki Markup |
---|
Harjoitustehtävät Qt:n ja C++:n oppimiseen. Jokainen tehtävä on 2 pisteen arvoinen. Näytä opettajalle tekemäsi tehtävä, niin saat pisteet kotiin. Pisteet lisätään saamiisi kokeen pisteisiin. Kurssin kokonaispistemäärä on noin 100 ja sillä saa vitosen. Noin 50 pisteellä saa ykkösen. |
...
# Tee Qt Creator ohjelmalla dialogi-sovellus. Laita dialogiin liukupalkki ja "lcd"-näyttö [QLCDNumber|http://doc.qt.nokia.com/latest/qlcdnumber.html]. Johda liukupalkin signaali (valueChanged) "lcd"-näytön slotiin (display) signal-slot tilassa (F4). Tee graafisella editorilla kytkennät "widgettien" välille. Testaa sovellus. |
...
# Tee edellinen tehtävä connect-funktion avulla eli lisää Dialogin muodostimeen connect.... Alla esimerkki connect-funktion käytöstä: |
...
{code |
...
} Dialogi::Dialogi(QWidget *parent) : QDialog(parent), ui(new Ui::Dialogi) { ui->setupUi(this); //yhdistetaan signaalit ja slotit, valitse komponentit valikosta ALÄ KOPIOI ettei mene suteen connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->lcd,SLOT(display(int))); .... |
...
{code} # Laita graafisessa editorissa edellisen liukupalkin alarajaksi \-100 ja ylärajaksi 100. Testaa. # Vie liukupalkin arvo edistymispalkin " [QProgressBar|http://doc.qt.nokia.com/latest/qprogressbar.html] " arvoksi. Tee kytkentä graafisella editorilla. # Tee edellinen tehtävä connect-funktiolla samaan tapaan kuin tehtävässä kaksi. # Tässä tehtävässä viet haluamasi tekstin labeliin eli tekstinäyttöön ruudulla, kun painat dialogissa olevaa nappulaa. Eli tee dialogi, johon luot graafisessa editorissa [painonapin|http://doc.qt.nokia.com/latest/qpushbutton.html] ja [labelin|http://doc.qt.nokia.com/latest/qlabel.html]. Nimeä nappi ja label siten, että muistat niiden merkityksen. Tee lisäksi painonapille slot siirtämällä hiiren kursori napin päälle ja painamalla hiiren oikeaa painiketta ja sieltä valinta: go to slot . Tee .h-tiedostoon oma slot seuraavasti eli avaa Dialog.h ja aaltosulkeiden sisälle ennen lopettavaa sulkua lisää alla oleva teksti. {code} ... public slots: void nayta(); ... |
...
{code} Tee slotin toteutus tiedostoon Dialog.cpp. Lisää tiedoston loppuun funktio, joka näyttää tekstin label ruudulla. |
...
{code |
...
} //tämän lisäät Dialog.cpp tiedoston loppuun void Dialog::nayta() { //laita ui-> jos olet tehnyt labelin dialogiin QString Tekstia;//tämä on muuttuja joka tallettaa merkkijonoja Tekstia="juttuja"; ui->label->setText(Tekstia);//tällä laitat tekstin labeliin } |
...
{code} Liitä napin signaali omaan slotiisi. Tee tämä dialogin muodostimessa (slot on nyt Dialogissa). |
...
{code |
...
} ui->setupUi(this);//tämä on jo tullut automaattisesti //yhdistetaan signaalit ja slotit, valitse komponentit valikosta ALÄ KOPIOI ettei mene suteen {code} //this alla tarkoittaa, että vastaanottaja on tämän tiedoston (luokan) slot connect(ui->Nappi,SIGNAL(clicked()),this,SLOT(nayta())); |
...
Code Block |
---|
{code} # Tee [QTimer|http://doc.qt.nokia.com/latest/qtimer.html]\-luokan avulla sekuntikello, jonka tarkkuus on yksi sekunti. Laita dialogiin painikkeet start, pause, stop ja nollaus. Tee painikkeille slotit sekä vielä lcd-näyttö kellon arvoa varten. Tee QTimer timer; muuttuja Dialog.h tiedostoon. {code} #include <QDialog> // tämä on jo #include <QTimer> //lisää tämä ... lisää seuraavat muuttujat luokkamäärittelyyn ~Dialog();// tämä on jo QTimer timer;//ajastin ajan laskentaa varten int laskuri;//laskuri joka laskee ajastimen timeout eli kertoja jotka ajastin on käynyt loppuun ... private slots: void on_StopTimer_clicked();//tämä tuli automaattiseti kun teit Stop painikkeen ja sille slotin "go to slot" määrittelyllä void on_StartTimer_clicked();//ja tuli kanssa samalla tavoin void PaivitaNaytto();//tämän joudut tekemään itse ja vastaavan funktion Dialog.cpp tiedostoon }; {code} Nyt timer on muuttuja, joka sisältää ajastimen. Esimerkiksi timer.start(1000) käynnistää ajastimen yhden sekunnin resoluutiolla. Ajastimen timeout signaalin joudut kiinnittämään itse tekemääsi slotiin PavitaNaytto seuraavasti |
...
{code |
} ui->setupUi(this);//tämän on jo Dialogin muodotimessa //tämän liitynnän ajastimen timeout signaalista ja PaivitaNaytto connect(&timer,SIGNAL(timeout()),this,SLOT(PaivitaNaytto())); {code} Ja sitten vielä funktiot Dialog.cpp tiedostoon. |
...
{code |
} void Dialog::on_StartTimer_clicked() { timer.start(100); laskuri=0; } void Dialog::on_StopTimer_clicked() { timer.stop(); } //ajetaan läpi timeoutista void Dialog::PaivitaNaytto() { laskuri++; ui->lcdNumber->display(laskuri); } {code} Tee kaikki tarvittavat funktiot ja testaa ohjelma. |
...
# Muuta edellisen tehtävän kelloa siten, että tarkkuus on 0.01 sekuntia. |
...
# Muuta edellisen tehtävää siten, että nyt on vain painonapit start/pause, stop ja nollaus. Eli muuta start/pause-napin tekstiä sen mukaan onko ajastin tilassa *käynnissä*/*pysäytettynä*. Huom\! tarvitset luokkaan muuttujan, jossa pidät yllä laskurin tilaa. |
...
# Muuta edellistä tehtävää siten, että voit muuttaa tarkkuutta vaikka [spinBox|http://doc.trolltech.com/4.3/qspinbox.html] "widgetillä". |
...
{code |
...
} void Dialog::on_StartTimer_clicked() { int aika= ui->spinBox->value(); timer.start(aika); laskuri=0; } {code} |
...
# Tee ohjelma, joka sisältää painonapin " |
...
[PushButton|http://doc.qt.nokia.com/latest/qpushbutton.html]" ja viesti-ikkunan "[MessageBox|http://doc.qt.nokia.com/latest/qmessagebox.html]". Kun painetaan nappia, ohjelma näyttää viestiruudulla "MessageBox" viestin "nappia painettu". # Vie edellisen tehtävän teksti [QLabel|http://doc.qt.nokia.com/latest/qlabel.html] ikkunaan. # Vie edellisen tehtävän teksti [QLineEdit|http://doc.qt.nokia.com/latest/qlineedit.html] ikkunaan # Tutustu Qt:n [QDebug|http://doc.qt.nokia.com/latest/qdebug.html] luokkaan ja tulosta sen avulla edellisen tehtävän teksti komentoikkunaan. # Tee ohjelma, joka ilmoittaa millä välillä annettu luku on. Laita annettu arvo lineEdit "ikkunaan" ja nappia "pushButton" painettaessa testaa if-lauseella arvoalue. Aseta "[RadioButton|http://doc.qt.nokia.com/latest/qradiobutton.html]"in (yhden kolmesta) arvo osoittamaan arvoväliä 0...10, 11...100 tai >100. |
...
# Vie liukupalkin data muuttujaan ja testaa debugerilla ja breakpointin avulla, että siirto onnistui. |
...
*********2. sarja tehtäviä ***********
...
[ohjeita|https://wiki.metropolia.fi/display/koneautomaatio/Dialogin+wizardin+arvon+luku+muuttujaan] # Tee Radio button valikko kolmella painikkeella dialogiin. Lisää teksiruutu, jossa kerrot mitä painikkeista on painettu. # Tee ohjelmallisesti dialogi, jossa on oikealla plus-, miinus-, kerto\- ja jakopainikkeet. Vasemmalla on kolme teksti-ikkunaa, kahden ylimmän ruudun tulos laitetaan alimpaan ruutuun riippuen painettavasta napista. Lisää tekstikenttiin validaattorit, ettei numerokenttiin voi syöttää kirjaimia kts. mallia esimerkistä [double validator]. # Tee dialogi, jossa on progress bar, joka etenee ajastimen tahdissa. Progress barin voi käynnistää, nollata ja pysäyttää painikkeilla. Laita ajastimen jaksoajaksi 0,5 sekuntia. Näytä arvo myös "lcd"-näytöllä. # Tee graafisella editorilla dialogi, johon sijoitat kuusi haluamaasi widgettiä ja erottele rinnakkaiset widgetit spacerilla toisistaan. Ryhmittele widgetit kolmeen allekkaiseen ryhmään kolmella horisonttaalisella layoutilla. # Jatka edellistä tehtävää siten, että teet groupboxin rinnakkaisten widgettien ympärille ja ylimmän ryhmän napilla kätket alemmat widget-ryhmät. Kokeile sizehint käskyä muotoillaksesi dialogia oikean kokoiseksi. # Tee [dialogi |https://wiki.metropolia.fi/display/koneautomaatio/Dialogin+toteutus+ohjelmallisesti+ilman+Qt+Designeria] graaffisella editorilla. # Tee dialogi esimerkki, jossa [pino|https://wiki.metropolia.fi/display/koneautomaatio/Luokkamallit] on aliluokkana. Tee nappula "Laita pinoon" ja "Ota pinosta". # Tee edellinen esimerkki QStack template luokkaa käyttäen. # Tee dialogi, jolla voit laittaa ja katsella lukuja vektorissa, käytä QVector objektia. # Tee dialogi, jolla voit laittaa ja katsella lukuja vektorissa, käytä QList objektia. \**\**\**\**\**\**\**\**\**2. sarja tehtäviä **\**\**\**\**\**\**\**\**\*\* # Tutustu Kvaserin simplewrite.c ohjelmaan ja liitä se Qt\- dialogiin siten, että voit syöttää ohjelman tiedot dialogsta. # Tutustu Kvaserin canmonitor.c ohjelmaan ja liitä se Qt\- dialogiin siten, että voit syöttää ohjelman tiedot dialogsta. # Tutustu Qwt esimerkkeihin ja tee kolmannen esimerkin pohjalta ohjelma, joka piirtää plot-ikkunaan cosini-käyrää. # Tee sql esimerkin avulla projektitietokanta, jossa on sarakkeet ProjektinNimi, AloitusPvm, Projektipaallikko, Budjetti. # Ota paluuarvot talteen edellisen tehtävän sql-kyselyistä ja näytä virheet QMessageBoxilla. Käyttäjätunnus root ja salasana huhtikuu. # Asenna tietokooneeseen MySql palvelin ja core. # Asenna MySql Administrator, Query Browser ja Worbench # Tee tehtävän 18. taulu MySql-tietokantaan. # Suunnittele luokkamalli koneelle. Luokka Kone koostuu luokista Toimilaite ja Prosessi. Toimilaite koostaa luokan Liikeanturi ja VoimaAnturi. Nämä luokat taas perivät luokan Anturi. Tee luokista ensin UML-malli Dia:lla ja sitten Qt:llä. # Muokkaa mallia siten, että teet luokan dialogi ja laitat sen jäseneksi luokan Kone. Periytä Kone luokasta QThread. # Korjaa Dialla tekemä malli edellisen tehtävän mukaiseksi. # Lisää anturille jäsenet double vahvistus, double offset, double tulo, double tuloSiYksikkona, double taarattuTuloSiYksikkona, double KeskiarvoistusVektori\[10\], i , int paikkaVektorissa, double Summa |
...
# Tee käyttöliittymään nappi |
...
ui | Dialog |
| Anturi |
---|---|---|---|
MittaaTulo-> | ->Mittaa |
|
|
| MittaaTulonArvo-> |
| ->PaivitaTulo |
| ArvonNaytto<- |
| <- LahetaMitattuArvo(double) |
...
MittaaTulo ja sille Dialog luokkaan slot Mittaa. Laita myös LineEdit tai lcd, josta voit lukea mitatun arvon. # Tee Dialog luokkaan signaali MittaaTulonArvo. # Tee luokkaan Anturi slot void PaivitaTulo(); # Yhdistä signaali MittaaTulonArvo slotiin PaivitaTulo. # Emitoi (lähetä) signaali MittaaTulonArvo käyttöliittymän slotissa Mittaa. # Tee luokkaan Anturi signaali LahetaMitattuArvo(double) ja ota se vastaan käyttöliittymässä. || ui || Dialog || || Anturi || | MittaaTulo-> \\ | \->Mittaa | | | | | MittaaTulonArvo-> | | \->PaivitaTulo | | | ArvonNaytto<\- \\ | | <\- LahetaMitattuArvo(double) | # Laita jokin arvo emitoimaasi signaaliin LahetaMitattuArvo(double) ja testaa, että arvo tulee näytölle. # Tee käyttöliittymään Horizontal Slider ja välitä se signaali - slot mekanismilla Anturi\- luokan muuttujaan tulo. # Tee Anturi-luokkaan funktio Paivita. Kutsu tätä edellisessä tehtävässä tekemästäsi slotista. # Laita Paivita - funktion sisällöksi tuloSiYksikkona=tulo*vahvistu+offset; |
...
# Testaa, että vahvistettu tulo tulee näytölle. |
...
# Tee Umbrello \-ohjelmalla UML-malli tähän asti tekemästäsi softasta. |
...
# Tässä tehtävässä toteutamme asynkronisen säikeen, joka lukee anturia ja lähettää signaalilla tiedon käyttöliittymälle. Tee Kone luokkaan run-funktio |
...
ja siihen forever toistorakenne. Katso mallia [säikeistetystä ohjelmasta. |
...
|http://wiki.metropolia.fi/pages/viewpage.action?pageId=14687120]\ {code} //tämä luokan esittelyyn QTime displayUpdateTimer; |
...
{code} {code} forever { //Tähän anturin tiedon laskenta if (NayttoAjastin.elapsed() > Paivitysaika) { Nayttoajastin.restart(); emit LahetaAnturinTiedot(Arvo); } } {code} |
...
# Hae koneen arvot Sqlite tietokannasta [esimerkin |
...
Code Block |
---|
|http://wiki.metropolia.fi/display/koneautomaatio/Haku+tietokannasta] mukaisesti. # Tee Qwt plot esimerkki. # Hyödynnä esimerkkiä ja tulosta anturin arvo qwtplotissa. # Päivitä edellisiä tehtäviä kuvaava Umbrello malli. # Tee kone esimerkki siten, että teet kaikista luokista dialogeja. Laita luokkiin toimilaite ja anturi liukupalkit, joilla voit säätää niiden antamia arvoja. Älä käytä enää QThread luokkaa kone luokan perinnässä. # Tee dialog perustainen ohjelma ja koosta se kahdesta alidialogista. Kokeile dialogien avausta show ja exec funktioilla, mitä huomaat? Ohjeita: sisällytä "include" alidialogit päädialogin otsikkotiedostoon, tee dialogeille muuttujat päädialogiin, tee päädialogiin nappi, jolla avaat alidialogit funktioilla exec tai show. # Lisää edellisen tehtävän dilogeihin viestinvälitystä. Lähetä viesti päädialogista molempiin alidialogeihin. Esimerkiksi niin, että teet dialogiin napin, joka lähettää editline viestin molemmille alidialogeille. # Lisää alidialogeihin viestinvälitys toiseen alidialogiin edellisessä tehtävässä kuvatulla tavalla. # Lisää vielä alidialogeihin vistinvälitys päädialogiin. # Tutustu Kvaserin simplewrite.c ohjelmaan ja liitä se Qt\- dialogiin siten, että voit syöttää ohjelman tiedot dialogista. # Tutustu Kvaserin canmonitor.c ohjelmaan ja liitä se Qt\- dialogiin siten, että voit syöttää ohjelman tiedot dialogista. # Tee ohjaus manipulaattorille, joka nostaa laatikon pöydältä ja laittaa sen toiselle pöydälle. # Tee edellinen tehtävä käyttäen switch-case rakennetta ja QTimer ajastinta. Kts. Qt:n wiki. # Tee edellinen tehtävä käyttäen tilakoneessa omaa Säiettä QThread. # Asenna koneeseesi Synapticin avulla Sliteman Sqlite tietokanta editori. # Tee tietokantataulu Sliteman ohjelmalla Sylinteri, jossa on kentät id, nimi, isku, vahvistus ja tulosta taulun asetukset tekstitiedostoon. # Kokeile tehdä samainen taulu seuraavalla sql-komennolla: {code} CREATE TABLE sylinteri ( id INTEGER PRIMARY KEY NOT NULL, nimi TEXT, isku REAL, vahvistus REAL ); {code} |