Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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.

...

  1. Tee Qt Creator ohjelmalla dialogi-sovellus.

...

  1. Laita

...

  1. dialogiin

...

  1. liukupalkki

...

  1. ja

...

  1. "lcd"-näyttö

...

  1. QLCDNumber

...

  1. .

...

  1. Johda

...

  1. liukupalkin

...

  1. signaali

...

  1. (valueChanged)

...

  1. "lcd"-näytön

...

  1. slotiin

...

  1. (display)

...

  1. signal-slot

...

  1. tilassa

...

  1. (F4).

...

  1. Tee

...

  1. graafisella

...

  1. editorilla

...

  1. kytkennät

...

  1. "widgettien"

...

  1. välille.

...

  1. Testaa

...

  1. sovellus.

...

  1. Tee

...

  1. edellinen

...

  1. tehtävä

...

  1. connect-funktion

...

  1. avulla

...

  1. eli

...

  1. lisää

...

  1. Dialogin

...

  1. muodostimeen

...

  1. connect....

...

  1. Alla

...

  1. esimerkki

...

  1. connect-funktion

...

  1. käytöstä:

...

  1. Code Block

...

  1. 
        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)));
          ....
    

...

  1. Laita graafisessa editorissa edellisen liukupalkin alarajaksi -100 ja ylärajaksi 100. Testaa.
  2. Vie liukupalkin arvo edistymispalkin " QProgressBar " arvoksi. Tee kytkentä graafisella editorilla.
  3. Tee edellinen tehtävä connect-funktiolla.
  4. Tee dialogi, johon luot painonapin ja labelin. Lisäksi tee .h-tiedostoon oma slot. Esim:
    Code Block
    
    ...
    public slots:
        void nayta();
    ...
    

...

  1. Slotin

...

  1. toteutuksessa

...

  1. (.cpp)

...

  1. muuta

...

  1. tekstikentän

...

  1. tekstiä.

...

  1. Esim:

...

  1. Code Block

...

  1. 
    ...
    void Dialog::nayta()
    {
        label.setText("tähän jotain tekstiä");
    }
    ...
    

...

  1. Liitä

...

  1. napin

...

  1. signaali

...

  1. omaan

...

  1. slotiisi

...

  1. (slot

...

  1. on

...

  1. nyt

...

  1. Dialogissa).

...

  1. Tee

...

  1. QTimer

...

  1. -luokan

...

  1. avulla

...

  1. sekuntikello,

...

  1. jonka

...

  1. tarkkuus

...

  1. on

...

  1. yksi

...

  1. sekunti.

...

  1. Laita

...

  1. dialogiin

...

  1. painikkeet

...

  1. start,

...

  1. pause,

...

  1. stop

...

  1. ja

...

  1. nollaus

...

  1. sekä

...

  1. lcd-näyttö

...

  1. kellon

...

  1. arvoa

...

  1. varten.

...

  1. Tee

...

  1. QTimer

...

  1. timer;

...

  1. muuttuja

...

  1. Dialog.h

...

  1. tiedostoon.

...

  1. Nyt

...

  1. timer

...

  1. on

...

  1. muuttuja,

...

  1. joka

...

  1. sisältää

...

  1. ajastimen.

...

  1. Esimerkiksi

...

  1. timer.start(1000)

...

  1. käynnistää

...

  1. ajastimen

...

  1. yhden

...

  1. sekunnin

...

  1. resoluutiolla.

...

  1. QTimer

...

  1. ajastimen

...

  1. resoluutio

...

  1. on

...

  1. 1ms.

...

  1. Eli

...

  1. jos

...

  1. haluat

...

  1. resoluutioksi

...

  1. esimerkiksi

...

  1. 10

...

  1. ms,

...

  1. täytyy

...

  1. start

...

  1. funktioon

...

  1. laittaa

...

  1. parametriksi

...

  1. 10.

...

  1. Muuta

...

  1. edellisen

...

  1. tehtävän

...

  1. kelloa

...

  1. siten,

...

  1. että

...

  1. tarkkuus

...

  1. on

...

  1. 0.01

...

  1. sekuntia.

...

  1. Muuta

...

  1. edellisen

...

  1. tehtävää

...

  1. siten,

...

  1. että

...

  1. nyt

...

  1. on

...

  1. vain

...

  1. painonapit

...

  1. start/pause,

...

  1. stop

...

  1. ja

...

  1. nollaus.

...

  1. Eli

...

  1. muuta

...

  1. start/pause-napin

...

  1. tekstiä

...

  1. sen

...

  1. mukaan

...

  1. onko

...

  1. ajastin

...

  1. tilassa

...

  1. käynnissä

...

  1. /

...

  1. pysäytettynä

...

  1. .

...

  1. Huom

...

  1. !

...

  1. tarvitset

...

  1. luokkaan

...

  1. muuttujan,

...

  1. jossa

...

  1. pidät

...

  1. yllä

...

  1. laskurin

...

  1. tilaa.

...

  1. Muuta

...

  1. edellistä

...

  1. tehtävää

...

  1. siten,

...

  1. että

...

  1. voit

...

  1. muuttaa

...

  1. tarkkuutta

...

  1. vaikka

...

  1. spinBox

...

  1. "widgetillä".

...

  1. Code Block

...

  1. 
    void Dialog::on_StartTimer_clicked()
    {
        int aika= ui->spinBox->value();
        timer.start(aika);
        laskuri=0;
    }
    

...

  1. Tee ohjelma,

...

  1. joka

...

  1. sisältää

...

  1. painonapin

...

  1. "

...

  1. PushButton

...

  1. "

...

  1. ja

...

  1. viesti-ikkunan

...

  1. "

...

  1. MessageBox

...

  1. ".

...

  1. Kun

...

  1. painetaan

...

  1. nappia,

...

  1. ohjelma

...

  1. näyttää

...

  1. viestiruudulla

...

  1. "MessageBox"

...

  1. viestin

...

  1. "nappia

...

  1. painettu".

...

  1. Vie

...

  1. edellisen

...

  1. tehtävän

...

  1. teksti

...

  1. QLabel

...

  1. ikkunaan.
  2. Vie edellisen tehtävän teksti QLineEdit ikkunaan
  3. Tutustu Qt:n QDebug luokkaan ja tulosta sen avulla edellisen tehtävän teksti komentoikkunaan.
  4. 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,

...

  1. 11...100

...

  1. tai

...

  1. >100.

...

  1. Vie

...

  1. liukupalkin

...

  1. data

...

  1. muuttujaan

...

  1. ja

...

  1. testaa

...

  1. debugerilla

...

  1. ja

...

  1. breakpointin

...

  1. avulla,

...

  1. että

...

  1. siirto

...

  1. onnistui.

...

  1. ohjeita
  2. Tee Radio button valikko kolmella painikkeella dialogiin. Lisää teksiruutu, jossa kerrot mitä painikkeista on painettu.
  3. 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.
  4. 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ä.
  5. Tee graafisella editorilla dialogi, johon sijoitat kuusi haluamaasi widgettiä ja erottele rinnakkaiset widgetit spacerilla toisistaan. Ryhmittele widgetit kolmeen allekkaiseen ryhmään kolmella horisonttaalisella layoutilla.
  6. 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.
  7. Tee dialogi graaffisella editorilla.
  8. Tee dialogi esimerkki, jossa pino on aliluokkana. Tee nappula "Laita pinoon" ja "Ota pinosta".
  9. Tee edellinen esimerkki QStack template luokkaa käyttäen.
  10. Tee dialogi, jolla voit laittaa ja katsella lukuja vektorissa, käytä QVector objektia.
  11. Tee dialogi, jolla voit laittaa ja katsella lukuja vektorissa, käytä QList objektia.
  12. Tutustu Kvaserin simplewrite.c ohjelmaan ja liitä se Qt- dialogiin siten, että voit syöttää ohjelman tiedot dialogsta.  
  13. Tutustu Kvaserin canmonitor.c ohjelmaan ja liitä se Qt- dialogiin siten, että voit syöttää ohjelman tiedot dialogsta.
  14. Tutustu Qwt esimerkkeihin ja tee kolmannen esimerkin pohjalta ohjelma, joka piirtää plot-ikkunaan cosini-käyrää. 
  15. Tee sql esimerkin avulla projektitietokanta, jossa on sarakkeet ProjektinNimi, AloitusPvm, Projektipaallikko, Budjetti.
  16. Ota paluuarvot talteen edellisen tehtävän sql-kyselyistä ja näytä virheet QMessageBoxilla. Käyttäjätunnus root ja salasana huhtikuu.
  17. Asenna tietokooneeseen MySql palvelin ja core.
  18. Asenna MySql Administrator, Query Browser ja Worbench
  19. Tee tehtävän 18. taulu MySql-tietokantaan.
  20. 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ä.
  21. Muokkaa mallia siten, että teet luokan dialogi ja laitat sen jäseneksi luokan Kone. Periytä Kone luokasta QThread. 
  22. Korjaa Dialla tekemä malli edellisen tehtävän mukaiseksi.
  23. Wiki Markup
    Lisää anturille jäsenet double vahvistus, double offset, double  tulo, double tuloSiYksikkona, double taarattuTuloSiYksikkona, double  KeskiarvoistusVektori\[10\], i , int paikkaVektorissa,  double Summa

...

  1. Tee

...

  1. käyttöliittymään

...

  1. nappi

...

  1. MittaaTulo ja  sille Dialog luokkaan slot Mittaa. Laita myös LineEdit tai lcd, josta voit lukea mitatun arvon.
  2. Tee Dialog luokkaan signaali MittaaTulonArvo.
  3. Tee luokkaan Anturi slot void PaivitaTulo();
  4. Yhdistä signaali MittaaTulonArvo slotiin PaivitaTulo.
  5. Emitoi (lähetä) signaali MittaaTulonArvo käyttöliittymän slotissa Mittaa.
  6. Tee luokkaan Anturi signaali LahetaMitattuArvo(double) ja ota se vastaan käyttöliittymässä.

    ui

    Dialog

     

    Anturi

    MittaaTulo->

    ->Mittaa

     

     

     

    MittaaTulonArvo->

     

    ->PaivitaTulo

     

    ArvonNaytto<-

     

    <- LahetaMitattuArvo(double)

  7. Laita jokin arvo emitoimaasi signaaliin LahetaMitattuArvo(double) ja testaa, että arvo tulee näytölle.
  8. Tee käyttöliittymään Horizontal Slider ja välitä se signaali - slot mekanismilla  Anturi- luokan muuttujaan tulo.
  9. Tee Anturi-luokkaan funktio Paivita. Kutsu tätä edellisessä tehtävässä tekemästäsi slotista.
  10. Laita Paivita - funktion sisällöksi tuloSiYksikkona=tulo*vahvistu+offset;

...

  1. Testaa,

...

  1. että

...

  1. vahvistettu

...

  1. tulo

...

  1. tulee

...

  1. näytölle.

...

  1. Tee  Umbrello -ohjelmalla

...

  1. UML-malli

...

  1. tähän

...

  1. asti

...

  1. tekemästäsi

...

  1. softasta.

...

  1. Tässä

...

  1. tehtävässä

...

  1. toteutamme

...

  1. asynkronisen

...

  1. säikeen,

...

  1. joka

...

  1. lukee

...

  1. anturia

...

  1. ja

...

  1. lähettää

...

  1. signaalilla

...

  1. tiedon

...

  1. käyttöliittymälle.

...

  1. Tee

...

  1. Kone

...

  1. luokkaan

...

  1. run-funktio

...

  1. ja  siihen forever toistorakenne.

...

  1. Katso

...

  1. mallia

...

  1. säikeistetystä

...

  1. ohjelmasta

...

  1. .

...

  1. \
    Code Block
    
    //tämä luokan esittelyyn

...

  1. 
    

...

  1. QTime displayUpdateTimer;

...

  1. 
    
    Code Block
    
    forever
      {
            //Tähän anturin tiedon laskenta
              if (NayttoAjastin.elapsed() > Paivitysaika)

...

  1. 
              {
                  Nayttoajastin.restart();

...

  1. 
                  emit LahetaAnturinTiedot(Arvo);

...

  1. 
              }
    }
    
  1. Tee esimerkki Qwt plot|display/koneautomaatio/QwtPlot+-+esimerkki

...

  1. \ esimerkki.

...

  1. Hyödynnä

...

  1. esimerkkiä

...

  1. ja

...

  1. tulosta

...

  1. anturin

...

  1. arvo

...

  1. qwtplotissa.

...

  1. Päivitä

...

  1. edellisiä

...

  1. tehtäviä

...

  1. kuvaava

...

  1. Umbrello

...

  1. malli.

...

  1. Tee

...

  1. kone

...

  1. esimerkki

...

  1. siten,

...

  1. että

...

  1. teet

...

  1. kaikista

...

  1. luokista

...

  1. dialogeja.

...

  1. Laita

...

  1. luokkiin

...

  1. toimilaite

...

  1. ja

...

  1. anturi

...

  1. liukupalkit,

...

  1. joilla

...

  1. voit

...

  1. säätää

...

  1. niiden

...

  1. antamia

...

  1. arvoja.

...

  1. Älä

...

  1. käytä

...

  1. enää

...

  1. QThread

...

  1. luokkaa

...

  1. kone

...

  1. luokan

...

  1. perinnässä.

...

  1. Tee

...

  1. dialog

...

  1. perustainen

...

  1. ohjelma

...

  1. ja

...

  1. koosta

...

  1. se

...

  1. kahdesta

...

  1. alidialogista.

...

  1. Kokeile

...

  1. dialogien

...

  1. avausta

...

  1. show

...

  1. ja

...

  1. exec

...

  1. funktioilla,

...

  1. mitä

...

  1. huomaat?

...

  1. Ohjeita:

...

  1. sisällytä

...

  1. "include"

...

  1. alidialogit

...

  1. päädialogin

...

  1. otsikkotiedostoon,

...

  1. tee

...

  1. dialogeille

...

  1. muuttujat

...

  1. päädialogiin,

...

  1. tee

...

  1. päädialogiin

...

  1. nappi,

...

  1. jolla

...

  1. avaat

...

  1. alidialogit

...

  1. funktioilla

...

  1. exec

...

  1. tai

...

  1. show.

...

  1.    
  2. 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.
  3. Lisää alidialogeihin viestinvälitys toiseen alidialogiin edellisessä tehtävässä kuvatulla tavalla.
  4. Lisää vielä alidialogeihin vistinvälitys päädialogiin.
  5. Tutustu Kvaserin simplewrite.c ohjelmaan ja liitä se Qt- dialogiin siten, että voit syöttää ohjelman tiedot dialogista.  
  6. Tutustu Kvaserin canmonitor.c ohjelmaan ja liitä se Qt- dialogiin siten, että voit syöttää ohjelman tiedot dialogista.
  7. Tee ohjaus manipulaattorille, joka nostaa laatikon pöydältä ja laittaa sen toiselle pöydälle. Käytä QStateMachine luokkaa ja sen aliluokkia.
  8. Tee edellinen tehtävä käyttäen switch-case rakennetta ja QTimer ajastinta. Kts. Qt:n wiki.
  9. Tee edellinen tehtävä käyttäen tilakoneessa omaa Säiettä QThread.
  10.