Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
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&nbsp; (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. &nbsp;
# 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ää.&nbsp;
# 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&nbsp; Dia:lla  ja sitten Qt:llä.
# Muokkaa mallia siten, että teet luokan dialogi ja laitat sen jäseneksi luokan Kone. Periytä Kone luokasta QThread.&nbsp;
# 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,&nbsp; double Summa

...


# Tee käyttöliittymään nappi

...

ui

Dialog

 

Anturi

MittaaTulo->

->Mittaa

 

 

 

MittaaTulonArvo->

 

->PaivitaTulo

 

ArvonNaytto<-

 

<- LahetaMitattuArvo(double)

...

 MittaaTulo ja&nbsp; 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&nbsp; 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&nbsp; 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&nbsp; 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&nbsp; 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. &nbsp; &nbsp;
# 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. &nbsp;
# 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.
# &nbsp;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.
# &nbsp;Kokeile tehdä samainen taulu seuraavalla sql-komennolla:

{code}
 CREATE TABLE sylinteri
(
    id INTEGER PRIMARY KEY NOT NULL,
    nimi TEXT,
    isku REAL,
    vahvistus REAL
);
{code}