(H) Painoindeksi¶
Tavoite: Opin tekemään yksinkertaisen dialogin Qt Designerilla ja ymmärtämään Qt:n signals & slots -mekanismia.
Ohjeita:
Toteuta uusi projekti: student/11/bmi/
.
Luo uusi projekti edellisten materiaaliosioiden ohjeiden mukaisesti.
Tehtävänä on toteuttaa Qt Designerilla alla olevan kuvan mukainen dialogi.
Kun käyttäjä on antanut paino- ja pituuslukemat ja klikannut
Count
-nappulaa, ohjelma laskee painoindeksin, jolloin
lopputulos on esimerkiksi alla olevan kuvan mukainen.
Etiketin (label) BMI
vieressä on toinen etiketti, joka on aluksi tyhjä
mutta johon Count
-nappulan klikkaamisen jälkeen tulostuu
painoindeksi.
Jos käyttäjä antaa pituudeksi nollan tai ei mitään, painoindeksiä ei
voida laskea (päädyttäisiin nollalla jakoon).
Tällöin edellä mainittuun etikettiin tulostuu teksti:
Cannot count
Etiketin Info
vieressä on textBrowser-komponentti, johon
tulostetaan jokin seuraavista teksteistä:
Underweight
Overweight
Normal range
Kuitenkin jos painoindeksiä ei voi laskea, edellä mainittuun textBrowser-komponenttiin ei tulosteta mitään.
Painoindeksi lasketaan kaavalla
Normaalipainon alarajana käytetään käytetään painoindeksin lukemaa 18.5 ja ylärajana lukemaa 25.
Ohje automaattitestien läpäisemiseksi
Käytä seuraavia objektinimiä lineEdit-widgeteille:
weightLineEdit
ja heightLineEdit
.
Näille widgeteille automaattitestit sallivat vain signaalit
editingFinished
ja textChanged
.
Käytä nappuloille nimiä:
countButton
ja closeButton
.
Käytä etiketille, johon painoindeksilukema tulostetaan, nimeä
resultLabel
.
Käytä textBrowser-widgetille, johon tieto ali-, yli- tai normaalipainosta
tulostetaan, nimeä infoTextBrowser
.
Halutessasi voit tehdä tehtävän seuraavissa vaiheissa:
Rakenna ensin kuvan mukainen dialogi. Kun olet luonut projektin edellisten materiaaliosioiden ohjeiden mukaan, Qt generoi osan luokkien koodista valmiiksi. Tiedostolistauksessa vasemmalla näkyy kohta Forms ja sen alla tiedosto
mainwindow.ui
. Klikkaamalla tämän tiedoston nimeä, pääset Qt Designeriin, jossa voit rakentaa dialogin raahaamalla sopivat käyttöliittymäkomponentit sopiville paikoille. Valitsemalla jonkin komponentin (joko piirtoalueelta tai oikealla olevasta Object-listasta) ja painamalla hiiren oikeanpuoleista nappia saat näkyviin valikon. Valitse valikostaChange objectName
antaaksesi objekteille yllä olevassa laatikossa kerrotut nimet.Jos haluat mahdollisimman nopeasti päästää testaamaan toimintoja, voit seuraavaksi toteuttaa dialogin sulkemisen. Tämän voi tehdä Qt Designerissa avaamalla Signals & Slots Editorin. Plus-merkistä pystyt lisäämään signaaleja ja sloteja valikon avulla. Tarvittavat valinnat:
- Sender: Close-nappula
- Signal: clicked()
- Receiver: MainWindow
- Slot: close()
Tässä tuli siis jo määriteltyä yksi signal-slot -yhteys. Muiden yhteyksien tekeminen ei onnistu ihan näin yksinkertaisesti.
Seuraavaksi voit kokeilla, miten syötetietojen (paino ja pituus) lukeminen onnistuu. Tässä tarvitaan jälleen signals & slots -mekanismia. Kun klikkaat lineEdit-komponenttia, avautuu valikko, josta voit valita
Go to slot ...
. Tällöin Qt generoi valmiiksi slot-funktion esittelynMainWindow.hh
-tiedostoon sekä vastaavan tyhjän funktionMainWindow.cpp
-tiedostoon. Kyseisen funktion rungon kirjoittaminen jää sinun vastuullesi.Lukemisen onnistumisen voit tarkistaa tulostamalla luetun tekstin
qDebug()
-virtaan, joka löytyyQDebug
-kirjastosta.Huomaa, että tarvittaessa voit kirjoittaa mitä tahansa C++-koodia valmiiksi generoituihin luokkiin. Voit lisätä luokkiin attribuutteja ja metodeja.
Kun olet varmistunut siitä, että saat talteen syötetyt luvut, voit toteuttaa laskenta-algoritmin. Siinä tarvitset vain ihan normaalia C++-koodia.
Vinkkejä tehtävän tekemiseen:
Tämän harjoituksen tekeminen pitäisi onnistua luennolla esitetyn esimerkin pohjalta. Jos et kuitenkaan ymmärtänyt yllä olevia vaiheita, kannattaa osallistua viikkoharjoituksiin tai käydä Kooditoriossa.
Muista, että oletuksena ohjelma käännetään
build
-hakemistoon. Testaamista varten kannattaa siirtää mahdolliset syötetiedostot tähän samaan hakemistoon.Jos ohjelmasi ei läpäise testejä, tarkista, ettei keskustietovarastossasi ole kääntäjän generoimia tiedostoja (ks. Plussan kohta 1.1.3 Automaattitestit). Huomaa, että kääntäjän generoimat tiedostot voivat myös alkaa pisteellä.
Kokonaisluvun tulostaminen ei onnistu suoraan, vaan joudut todennäköisesti muuttamaan arvon
QString
-tyyppisiksi Sen voi tehdä näin:int x = 0; QString s = QString::number(x);
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.