...
Harjoitustehtävät
...
Qt:n
...
ja
...
C++:n
...
oppimiseen.
...
Jokainen
...
tehtävä
...
on
...
2
...
pisteen
...
arvoinen.
...
Pisteet
...
lisätään
...
saamiisi
...
kokeen
...
pisteisiin.
...
Tutustu
...
kurssin
...
...
,
...
sieltä
...
löytyy
...
moneen
...
tehtävään
...
miltei
...
valmis
...
ratkaisu.
...
Lisäksi
...
Qt:n
...
...
...
ovat
...
erittäin
...
hyvä
...
oppimislähde,
...
niihin
...
kannattaa
...
tutustua.
...
Näiden
...
tehtävien
...
yksi
...
tärkeä
...
tehtävä
...
on
...
opettaa
...
opiskelijaa
...
käyttämään
...
Qt:n
...
help-sivustoja,
...
joten
...
kaikki
...
tehtävien
...
yhteydessä
...
olevat
...
linkit
...
kannattaa
...
käydä
...
läpi
...
.
Note |
---|
} Projektit kannattaa luoda virtuaalikoneessa C-levyn temp-hakemistoon ja kopioida lopuksi projektikansio Z-levylle (tai tikulle) turvaan \!
projekti luodaan suoraan Z-levylle, saa tulokseksi vain ongelmia. {note} # Tee Qt Creator ohjelmalla |
- Tee Qt Creator ohjelmalla dialogi-sovellus
...
- seuraavasti:
...
- valitse
...
- ->
...
- New
...
- file
...
- or
...
- project
...
- ->
...
- Qt
...
- Widget
...
- Project
...
- ->
...
- Qt
...
- Gui
...
- Application
...
- ->
...
- Anna
...
- projektin
...
- nimi
...
- ja
...
- tallennuskansio
...
- ->
...
- valitse
...
- QMainWindow
...
- tilalle
...
- QDialog
...
- ->aja
...
- loput
...
- oletusasetuksilla
...
- läpi.
...
- Valitse
...
- vasemmalta
...
- alhaalta
...
- Debug
...
- build.
...
- Käännä
...
- ja
...
- testaa
...
- sovellus
...
- painikkeella
...
- F5,
...
- ohjelman
...
- pitäisi
...
- käynnistyä
...
- ja
...
- dialogin
...
- piirtyä
...
- ruudulle.
...
- Tutustu
...
- koodiin
...
- ja
...
- etsi
...
- sieltä
...
- pääohjelma,
...
- muodostin
...
- =
...
- constructor
...
- sekä
...
- hajotin
...
- =
...
- destructor.
...
- Nimeä
...
- em.
...
- funktiot
...
- koodiin,
...
- kopioi
...
- koodi
...
- ja
...
- lähetä
...
- se
...
- tuubin
...
- kautta
...
- tehtävän
...
- 1.
...
- vastauksena.
...
- Älä
...
- käytä
...
- liitetiedostoa,
...
- vaan
...
- maalaa
...
- koodi
...
- vastausikkunaan.
...
- Laita
...
- break
...
- point
...
- kaikkiin
...
- lähdekoodiin
...
- funktioihin.
...
- Aja
...
- F5:llä
...
- kaikki
...
- bbreak
...
- pointit
...
- läpi.
...
- Missä
...
- järjestyksessä
...
- funktiot
...
- ajetaan?
...
- Vastaa
...
- tuubiin.
...
- Jatka
...
- edellistä
...
- tehtävää
...
- seuraavasti.
...
- Laita
...
- dialogiin
...
- liukupalkki
...
- (
...
...
...
...
...
- )
...
- ja
...
- "lcd"-näyttö
...
...
- . Johda liukupalkin signaali (valueChanged) "lcd"-näytön
...
- slotiin
...
- (display)
...
- signal-slot
...
- tilassa
...
- (F4).
...
- Tee
...
- graafisella
...
- editorilla
...
- kytkennät
...
- "widgettien"
...
- välille.
...
- Testaa
...
- sovellus.
...
- Laita
...
- graafisessa
...
- editorissa
...
- edellisen
...
- liukupalkin
...
- alarajaksi
...
- -100
...
- ja
...
- ylärajaksi
...
- 100.
...
- Testaa.
...
- zippaa
...
- tehtävä
...
- ja
...
- laita
...
- se
...
- tuubiin.
...
- Vie
...
- liukupalkin
...
- arvo
...
- edistymispalkin
...
- "
...
...
- "
...
- arvoksi.
...
- Tee
...
- uusi
...
- projekti tehtävälle no 1 ja laite siihen edellä olevat widgetit. Kytke connect-funktion
...
- avulla
...
- eli
...
- lisää
...
- Dialogin
...
- muodostimeen
...
- connect....
...
- Alla
...
- esimerkki
...
- connect-funktion
...
- käytöstä:
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
//alla olevasta koodista löydät viisi ensimmäistä riviä valmiina Dialogi.cpp tiedostosta, lisää connect funktio niiden perään //kuten tässäkin on tehty Dialogi::Dialogi(QWidget *parent) : QDialog(parent), ui(new Ui::Dialogi) { ui->setupUi(this);//tämä on jo tehty puolestasi automaattisesti //yhdistetaan signaalit ja slotit, valitse komponentit valikosta ALÄ KOPIOI ettei mene suteen //ui-> tarkoittaa sitä, että komponentti on käyttöliittymässä ja ui-> on osoite käyttöliittymään connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->lcd,SLOT(display(int))); ....
...
- Tee Dialog sovellus,
...
- jossa
...
- on
...
- Date
...
- Time
...
- Edit
...
- ja
...
- Calender
...
- widgetit.
...
- Kytke
...
- ne
...
- yhteen
...
- siten,
...
- että
...
- muutettaessa
...
- kumpaa
...
- tahansa,
...
- muuttuu
...
- myös
...
- toisen
...
- asetus.
...
- a.
...
- Tee graafisella editorilla slot.
...
- b
...
- Tee
...
- liityntä
...
- tehtävän
...
- 3.
...
- mukaisesti.
...
- Huom.
...
- lisää
...
- dialog.h
...
- tiedostoon
...
- #include
...
- <QDate>
...
- muiden
...
- include
...
- komentojen
...
- alle.
...
- Tee
...
- Dialog
...
- sovellus
...
- ,
...
- jossa
...
- Dial
...
- valikon
...
- arvo
...
- menee
...
- lcd-näyttöön.
...
- a.
...
- Tee graafisella
...
- editorilla
...
- slot.
...
- b
...
- Tee
...
- liityntä
...
- tehtävän
...
- 3.
...
- mukaisesti
...
- 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 ja labelin. Nimeä nappi ja label siten, että muistat niiden merkityksen. Tee .h-tiedostoon
...
- oma
...
- slotin
...
- esittely
...
- seuraavasti
...
- eli
...
- avaa
...
- Dialog.h
...
- ja
...
- aaltosulkeiden
...
- sisälle
...
- ennen
...
- lopettavaa
...
- sulkua
...
- lisää
...
- alla
...
- oleva
...
- teksti.
...
- Jos
...
- ei
...
- muistu
...
- mieleen
...
- slotit
...
- ja
...
- signaalit,
...
- niin
...
- katso
...
- täältä:
...
...
...
...
- sloteista
Code Block language cpp collapse true ... public slots: void nayta(); ...
...
Tee
...
- slotin
...
- toteutus
...
- tiedostoon
...
- Dialog.cpp.
...
- Lisää
...
- tiedostoon
...
- funktio,
...
- joka
...
- näyttää
...
- tekstin
...
- label
...
- ruudulla.
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
//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 }
...
Liitä napin signaali omaan slotiisi.
...
- Tee
...
- tämä
...
- dialogin
...
- muodostimessa
...
- (slot
...
- on
...
- nyt
...
- Dialogissa).
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
ui->setupUi(this);//tämä on jo tullut automaattisesti //yhdistetaan signaalit ja slotit, valitse komponentit valikosta ÄLÄ KOPIOI ettei mene suteen //this alla tarkoittaa, että vastaanottaja on tämän tiedoston (luokan) slot connect(ui->Nappi,SIGNAL(clicked()),this,SLOT(nayta()));
...
- Tässä tehtävässä on tarkoituksena tehdä sekuntikello, jonka voi käynnistää, laittaa tauolle, käynnistää uudelleen ja pysäyttää nappien avulla. Kello toteutetaan QTimer-luokan avulla (tutustu QTimer linkin alta löytyvään tekstiin!!!). Tee dialogiin painikkeet start, pause, jatka, stop ja nollaus. Tee painikkeille slotit (go to slot) sekä vielä lcd-näyttö kellon arvoa varten. Tee QTimer timer; muuttuja Dialog.h tiedostoon alla olevan esimerkin mukaisesti.
Code Block language cpp collapse true #include <QDialog> // tämä on jo tehty puolestasi eli lisää alla oleva rivi #include <QTimer> //lisää tämä, tähänhän jo tutustuit QTimer helpissä ... lisää seuraavat muuttujat luokan esittelyyn Dialog.h tiedostossa ~Dialog();// tämä on jo tehty puolestasi automaattisesti, lisää alla olevat muuttujat QTimer timer;//ajastin ajan laskentaa varten, tämä rivi sinun täytyy lisätä 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 };
...
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
...
- Dialogin
...
- muodostimessa,
...
- muistathan
...
- että
...
- muodostin
...
- on
...
- se
...
- jossa
...
- luokan
...
- nimi
...
- on
...
- sama
...
- kuin
...
- funktion
...
- nimi.
...
Code Block
...
language
...
cpp ui->setupUi(this);//tämä on jo Dialogin muodotimessa //tämän liitynnän ajastimen timeout signaalista ja PaivitaNaytto //& merkki tarkoitaa siirtymistä muuttujasta osoitteeseen //eli timer on muuttuja &timer on muuttujan osoite connect(&timer,SIGNAL(timeout()),this,SLOT(PaivitaNaytto()));
...
Ja
...
- sitten
...
- vielä
...
- funktioiden
...
- sisällöt
...
- Dialog.cpp
...
- tiedostoon.
...
- Muistathan,
...
- että
...
- teit
...
- funktioiden
...
- rungot
...
- "go
...
- to
...
- slot"
...
- mekanismilla.
...
Code Block
...
collapse
...
true
...
void Dialog::on_StartTimer_clicked()//tämän olet tehnyt "go to slot" määrittelyllä { timer.start(100); laskuri=0; } void Dialog::on_StopTimer_clicked()//tämän olet tehnyt "go to slot" määrittelyllä { timer.stop(); } //ja tähän ilmestyy loppujen painikkeiden slotit, kun teet ne "go to slot" määrittelyllä //ajetaan läpi timeoutista eli tämän teet itse void Dialog::PaivitaNaytto() { laskuri++; ui->lcdNumber->display(laskuri); }
...
Lisää
...
- vielä
...
- sisällöt
...
- funktioille
...
- Jatka
...
- ja
...
- Pause
...
- sekä
...
- tee
...
- kaikki
...
- tarvittavat
...
- funktiot
...
- ja
...
- testaa
...
- ohjelma.
...
- Muuta
...
- edellisen
...
- tehtävän
...
- kelloa
...
- siten,
...
- että
...
- tarkkuus
...
- on
...
- 0.01
...
- sekuntia.
...
- Eli
...
- joudut
...
- muuttamaan
...
- timerin
...
- start-asetusta.
...
- kts.
...
- QTimer
...
- help.
...
- Sijoita
...
- laskuri
...
- double
...
- tyypin
...
- muuttujaan
...
Code Block
...
language
...
cpp
...
double apu=laskuri;
...
ja
...
- jaa
...
- apu
...
- 100:lla
...
- (kokeile
...
- lukuja
...
- 100
...
- ja
...
- 100.0,
...
- miten
...
- ne
...
- eroaa?)
...
- sekä
...
- sijoita
...
- arvo
...
- lcd-näyttöön.
...
- 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.
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
void Dialog::on_StartTimer_clicked() { QString TekstiPainikkeessa; if(FlipFlop==false)//FlipFlop on bool tyypin muuttuja, joka on esiteltävä luokkamäärittelyssä Dialog.h bool FlipFlop; { timer.start(100); laskuri=0;//tämä rivi kannattanee siirtää muodostimeen, jos et muista mikä on muodostin niin tarkasta tehtävästä kaksi FlipFlop=true; //esittele tämä muuttuja Dialog.h tiedostossa bool FlipFlop; ja aseta //FlipFlop asetetaan tilaan false Dialogin muodostimessa (muodostin kts teht. 2) TekstiPainikkeessa="Pause"; ui->StartTimer->setText(TekstiPainikkeessa); } else { timer.stop(); FlipFlop=false; TekstiPainikkeessa="Start"; ui->StartTimer->setText(TekstiPainikkeessa); } }
...
- Muuta edellistä tehtävää siten,
...
- että
...
- voit
...
- muuttaa
...
- tarkkuutta
...
- vaikka
...
...
- "widgetillä".
...
- Muistat
...
- tietysti
...
- määritellä
...
- spinBoxin
...
- graafisessa
...
- käyttöliittymässä.
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
void Dialog::on_StartTimer_clicked() { int aika= ui->spinBox->value(); timer.start(aika); laskuri=0; ....
...
- Tässä tehtävässä opetellaan muuttujan ja osoittimen eroa. Joku fiksu jo varmaan ihmetteli, että miksi ajastin esiteltiin connect funktiossa näin connect(&timer....
...
- Tämä
...
- johtuu
...
- siitä,
...
- connect
...
- vaatii
...
- lähteen
...
- ja
...
- kohteen
...
- osoitteen
...
- sulkujen
...
- sisälle.
...
- Muuttujan
...
- osoite
...
- saadaan
...
- &
...
- merkillä,
...
- mutta
...
- voimme
...
- esitellä
...
- muuttujan
...
- jo
...
- valmiiksi
...
- osoitteena.
...
- Tällöin
...
- ohjelman
...
- syntaksi
...
- muuttuu
...
- ja
...
- timer
...
- muuttujaa
...
- ei
...
- enää
...
- käytetäkään
...
- esimerkiksi
...
- timer.start(100);
...
- vaan
...
- timer->start(100).
...
- Tässä
...
- tapauksessa
...
- timer
...
- muuttujalle
...
- täytyy
...
- myös
...
- varata
...
- muistia
...
- ja
...
- esittely
...
- tehdään
...
- toisella
...
- tavoin.
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = 0); ~Dialog(); //kun timer muuttujan eteen laitetaan * se on osoitin eikä muuttuja QTimer *timer; //laskuri joka laskee ajastimen timeout eli kertoja jotka ajastin on käynyt loppuun int laskuri;
...
Lisäksi joudutaan tekemään Dialog.cpp
...
- tiedostossa
...
- muodostimeen
...
- lisäys
...
- muistinvarausta
...
- varten.
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); timer = new QTimer();// nyt muisti on varattu ja timer osoitin on käytettävissä //eli nyt voidaan & merkki ottaa timer muuttujan edestä pois //this on muuten myös osoitin, kuten huomaat senkään edessä ei ole & merkkiä connect(timer,SIGNAL(timeout()),this,SLOT(PaivitaNaytto())); FlipFlop=false; }
...
Lisäksi
...
- joudut
...
- käymään
...
- läpi
...
- kaikki
...
- kohdat,
...
- joissa
...
- olet
...
- käyttänyt
...
- timer
...
- muuttujaa
...
- ja
...
- muuttamaan
...
- pisteet
...
- "nuoliksi".
...
- Tee
...
- ohjelma,
...
- joka
...
- sisältää
...
- painonapin
...
- "
...
...
- "
...
- ja
...
- viesti-ikkunan
...
- "
...
...
- ".
...
- Kun
...
- painetaan
...
- nappia,
...
- ohjelma
...
- näyttää
...
- viestiruudulla
...
- "MessageBox"
...
- viestin
...
- "nappia
...
- painettu".
...
- Vie
...
- edellisen
...
- tehtävän
...
- teksti
...
...
- ikkunaan.
- Vie edellisen tehtävän teksti QLineEdit ikkunaan
- Tutustu Qt:n QDebug 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"in (yhden kolmesta) arvo osoittamaan arvoväliä 0...10,
...
- 11...100
...
- tai
...
- >100.
...
- Tee
...
- edellinen
...
- tehtävä
...
- siten,
...
- että
...
- painonapilla
...
- vaihdat tekstikentän validaattoria "lennosta"
...
- ja
...
- laitat
...
- samalla
...
- vastaavan
...
- radioButtonin
...
- osoittamaan
...
- sallittua
...
- lukualuetta.
...
- Vie
...
- liukupalkin
...
- data
...
- muuttujaan
...
- ja
...
- testaa
...
- debugerilla
...
- ja
...
- breakpointin
...
- avulla,
...
- että
...
- siirto
...
- onnistui.
...
- ohjeita
- 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. Ohjeita. 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 säännöllisiä lauseita (regular expression) käyttäen syöttruutu, johon voi syöttää vain "Excel" solun arvoja, joissa on yksi kirjain ja numero välillä 1..99 eli esim A1, a1, mutta ei esimerkiksi 1a.
- 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.
- Tee edellisen tehtävän dialogi ohjelmallisesti. kts ohjeita
- Tee dialogi esimerkki, jossa pino 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ä *************
- Tee moottorinohjaukselle luokka-arkkitehtuuri, jossa koostavana luokkana on luokka Moottori ja aliluokkana PAsuihkutus. Koosta se vielä neljästä Suutin oliosta (käytä QVector muuttujaa). Peri luokka Moottori BeMoottori luokkaan. Koosta Dialog luokka BeMoottorista.
- Tee moottorille start painike ja laita dialogiin suuttimia varten radioButtonit, jotika välkkyvät suutinten aukeamisen tahtiin. Käytä QTimer oliota toiminnan tahdistamiseen. Tee kaasupoljin vaikka Silerilla ja kiihdytä ajastimen tahtia Sliderin avulla.
- Tee BeMoottori luokkaan Sytytys luokka ja keksi sille tekemistä.
- Tee luokkahierarkia koneenohjaukselle. Ylimpänä rakenteessa on luokka Kone, joka koostaa luokan toimilaite (QVector) ja toimilaite koostaa anturit, joita voi olla n. kappaletta.
- Tee broadcast server ja clien ohjelmista versiot, jossa dialogit tehdään graafisella editorille.
- Lisää edellisen tehtävän ohjelmiin kieliversiointi. (Suomi ja Englanti)
- Tee broadcast serveristä versio, jossa palveloin lähettää lämpötilaa. Simuloi lämpötilaa liukupalkilla. Muuta asiakas lukemaan ko. arvoa.
- Tutustu Fortune Client esimerkkiin. Tee esimerkin pohjalta uusi ohjelma, jossa dialogin ja verkon toiminnallisuudet ovat omissa luokissaan. Eli tee luokat Dialog ja Client. Toteuta esimerkki siten, että funktiot, jotka käsittelevät viestejä ovat askNewMessage ja readMessage (Dialog luokassa). Tee napit Connect, Ask Message, Read Message ja End.
- Kopioi Client luokkaan esimerkistä tcp-liitynnän sisältö (ei käyttöliittymää- eli Dialogin sisältöä).
- 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 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.\
Code Block language cpp collapse true //tämä luokan esittelyyn QTime displayUpdateTimer;
...
Code Block collapse true forever { //Tähän anturin tiedon laskenta if (NayttoAjastin.elapsed() > Paivitysaika) { Nayttoajastin.restart(); emit LahetaAnturinTiedot(Arvo); } }
...
- Hae koneen arvot Sqlite tietokannasta esimerkin 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 tietokanta Sliteman ohjelmalla ja lisää siihen taulu Sylinteri, jossa on kentät id, nimi, isku, vahvistus ja tulosta taulun asetukset tekstitiedostoon.
- Kokeile tehdä samainen taulu seuraavalla sql-komennolla:
Code Block language SQL collapse true CREATE TABLE sylinteri ( id INTEGER PRIMARY KEY NOT NULL, nimi TEXT, isku REAL, vahvistus REAL );
...
- Tee Sqlite tietokanta,
...
- joka
...
- sisältää
...
- taulut sensori kentillä sensor_id,
...
- vahvistus
...
- ja offset sekä kalibrointi kentillä kalibrointi_id,
...
- sensor_id,
...
- Todellinen,
...
- Mitattu
...
- ja
...
- vielä vierasavain tauluun sensori. Vähän mallia
Code Block language SQL collapse true FOREIGN KEY(sensor_id) REFERENCES sensor(sensor_id)
...
Täytä
...
- tauluihin
...
- kahden
...
- anturin
...
- tiedot
...
- ja
...
- testaa
...
- tiesotjen
...
- hakua
...
- sql-komennoilla,
...
- esimeriksi
...
Code Block
...
language
...
SQL
...
collapse
...
true
...
SELECT * FROM kalibrointi WHERE sensor_id=1;
...
- Tee ohjelma,
...
- joka
...
- lukee
...
- sensorien
...
- määrän
...
- sensoritaulusta
...
- ja
...
- muodostaa
...
- tarvittavan
...
- määrän
...
- sensoreita.
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
//luodaan sensori osoittimena Dilogi luokkaan QVector <Sensori> sensori; //luodaan vektori, joka sisältää sensoreja // esitellään dialog.h tiedostossa esimerkiksi näin Sensori *sensori; luetaan Dialogi.cpp :ssa sensorien määrä tietokannasta ja sitten luodaan new komennolla anturit sensori=new Sensori[maara];
...
- Tee sovellus,
...
- joka
...
- lukee
...
- sylinteritietokannasta
...
- sylinterien
...
- tiedot
...
- ja
...
- jokaiseen
...
- sylinteriin
...
- liittyy
...
- asema
...
- -
...
- ja
...
- voima-anturi
...
- ja
...
- niille
...
- kalibrointitaulu.
...
- Muista
...
- tehdä
...
- kalibrointitauluun
...
- vierasavain
...
- anturitauluun
...
- ja
...
- anturitauluun
...
- vierasavain
...
- sylinteritauluun.
...
- Näin
...
- saat
...
- yhdistettyä
...
- anturin
...
- oikealle
...
- sylinterille
...
- ja
...
- kalibrointitaulun
...
- oikealle
...
- anturille.
...
- Tässä
...
- tehtävässä
...
- tehdään
...
- säätöpiiri.
...
- Säätöpiirin
...
- tehtävänä
...
- on
...
- säätää
...
- sylinterille
...
- menevää
...
- ohjetta
...
- siten,
...
- että
...
- haluttu
...
- asema
...
- saavutetaan
...
- mahdollisimman
...
- hyvin.
...
- Jotta
...
- tehtävä
...
- olisi
...
- mielekäs,
...
- täytyy
...
- asema-anturin
...
- eli
...
- sylinterin
...
- oloarvon
...
- ja
...
- sylinterin
...
- halutun
...
- aseman
...
- eli
...
- sylinterin
...
- asetusarvon
...
- välistä
...
- suhdetta
...
- simuloida.
...
- Toteutetaan
...
- simulaattori
...
- tässä tehtävässä mahdollisen yksinkertaisesti seuraavan ajatuksen mukaisesti: jos ohje on suurempi kuin todellinen asema, lisätään todellista asemaa kellolla (QTimer timer muuttujan timeoutilla)
Code Block language cpp collapse true if(ohjesylinterille>olo)olo++; if(ohjesylinterille<olo)olo--;
...
Säätöpiiri
...
- voidaan
...
- tehdä
...
- yksinkertaisesti
...
- vähennys-ja
...
- kertolaskuilla
...
- seuraavasti:
...
Code Block
...
language
...
cpp
...
collapse
...
true
...
ohjesylinterille = (asetus-olo)*vahvistus;
...
Tehdään
...
- tehtävä
...
- aluksi
...
- ainoastaan
...
- hyödyntäen
...
- Dialog
...
- luokkaa.
...
- Eli
...
- tehdän
...
- Dialog
...
- luokkaan
...
- slider,
...
- jolla
...
- annetaan
...
- ohjearvoja
...
- ja
...
- lisäksi
...
- edistymispalkki
...
- johon
...
- laitetaan
...
- sylinterin
...
- todellinen
...
- asema.
...
- Ohjelmoi
...
- lisäksi
...
- tarvittava
...
- ajastin,
...
- jotta
...
- saat
...
- oloarvon
...
- muuttumaan
...
- edellä
...
- kuvatulla
...
- tavalla.
...
- Testaa
...
- millä
...
- vahvistuksen
...
- arvolla
...
- saat
...
- järjestelmän
...
- toimimaan
...
- (tee
...
- ohjelmaan
...
- editline
...
- ja
...
- sille
...
- validator,
...
- jolla
...
- rajataan
...
- vahvistuksen
...
- arvot
...
- välille
...
- 0...1000).
...
- Lisää
...
- tehtävään
...
- Qwt:n
...
- graafinen
...
- näyttö
...
- ja
...
- piirrä
...
- siihen
...
- asetus
...
- -
...
- oloarvot.
...
- Muuta
...
- edellisen
...
- tehtävän
...
- P-säädin
...
- PI-säätimeksi.
...
-
Code Block language cpp collapse true //lisätään summaan eroarvo, muista nollata summa muodostimessa IntegraattorinSumma+=(asetus-oloarvo); //ja sitten säädin ohjearvosylinterille=(asetus-oloarvo)*P_vahvistus+ IntegraattorinSumma*I_vahvistus;
...
Viritä
...
- säädin
...
...
...
...
- Lisää mittaushaaraan liukuva keskiarvo. Kts. Qt-esimerkit.
- Lisää säätimeen D-lohko.