(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.

Käyttöliittymä ennen syötteiden antamista

Kun käyttäjä on antanut paino- ja pituuslukemat ja klikannut Count-nappulaa, ohjelma laskee painoindeksin, jolloin lopputulos on esimerkiksi alla olevan kuvan mukainen.

Käyttöliittymä syötteineen ja tulostuksineen

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

\[Painoindeksi = \frac{paino[kg]}{(pituus[m])^{2}}\]

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 valikosta Change 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 esittelyn MainWindow.hh-tiedostoon sekä vastaavan tyhjän funktion MainWindow.cpp-tiedostoon. Kyseisen funktion rungon kirjoittaminen jää sinun vastuullesi.

    Lukemisen onnistumisen voit tarkistaa tulostamalla luetun tekstin qDebug()-virtaan, joka löytyy QDebug-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.