Viikkoharjoitus 1 Viikkoharjoituksessa tutustutaan signal-slot mekanismiin, QT:n Creatorin käyttöliittymäeditoriin, testataan debuggerin käyttöä, katsotaan debug-tulosteiden käyttöä ja käytetään dump-metodeita. Harjoituksessa tehdään mittayksikkömuunnin, jonka avulla muun muassa käsittämättömän hölmöt engelsmannien suosimat mittayksiköt saadaan muunnettua ihmisten käyttämään fiksumpaan muotoon tai sitten toiseen yhtä käsittämättömään formaattiin. Alla lista yksiköistä, joita ohjelma osaa tarjota muunneltavaksi: Metri m meripeninkulma mpk = 1 852 metriä maili 1 609,344 m = 8 furlongia jalka 0,3048 m furlong = 1/8 mailia 660 jalkaa tuuma = 0,0254 m Voit käyttää tekemääsi ohjelmaa seuraavan viikon harjoituksissa, joten kopio työsi hedelmät talteen äläkä tuhoa niitä. Työvaiheet: 1. Käynnistä QT, käynnistele ohjelma ja lisää ohjelmaan nappula ja sen clicked-signaalille käsittelijä slot. Luo uusi projekti (QT Creator->file->new->QT GUI application-> ) ja nimeä se esim Muuntelijaksi. Avaa QT Creatorin käyttöliittymäeditori (Project-Form->mainwindow.ui, aukeaa tuplaklikkaamalla). Lisää ohjelmaan nappula ja nimeä se convertbutton nimiseksi ja anna Muunna nappulan tekstiksi. Lisää nappulanpainalluksen käsittelevä slot (oikea nappi nappulan päällä, go to slot, clicked().
käyttöliittymäeditori 2. Käännä ja kokeile ohjelman ajoa (=tutustu vasemman alakulman nappeihin.) Lisää break point pääikkunan rakentajaan ja nappulan painalluksen käsittelijään. (klikkaa rivinumeron vasemmalla puolella). Käynnistä ohjelma debug-moodissa, kokeile ohjelman ajon askeltamista ja ajon vapauttamista. (kontrollit ympyröity, testaile niitä) Includoi qdebug ja lisää haluamasi debug-tekstit rakentajaan ja nappulan klikkauksen käsittelijään. (esim. qdebug() << "rakentajassa";) Lisää tämän jälkeen seuraavat rivit nappulan painalluksen käsittelijään ja katso mitä Application output näkymään QT:ssa tulostuu. dumpobjectinfo(); ui->nappulaolion_nimi->dumpobjectinfo();
debuggerin käynnistelyä 3. Palaa käyttöliittymäeditorin pariin, lisää käyttöliittymään LineEdit muunnettavaa arvoa varten ja toinen lineedit jota käytetään tuloksen näyttämään (aseta tulosboxin readonly property todeksi). Lisää kaksi ComboBoxia näkymään, toinen lähtöyksikön tyypin valintaan, toinen kohdeyksikön tyypin valitsemiseen. Tämän jälkeen voit lisätä haluamasi määrän labeleita tai groupboxeja, joiden avulla voit kertoa mikä minkin kentän tarkoitus on tai ryhmitellä widgettejä. Käännä ja aja & totea ettei ohjelma edelleenkään tee hirveästi juttuja Nyt edessä on ComboBoxien valintavaihtoehtojen lisääminen. Yksinkertaisimmillaan homma onnistuu antamalla arvot suoraan käyttöliittymäeditorilla. (oikea nappi comboboxin päällä ja edit items, lisäile haluamasi tekstit). Lisää toiseen ComboBoxiin kyllä ja ei vaihtoehdot ja aja ohjelma. Poista valinnat samassa paikassa missä lisäsitkin. :) Seuraavaksi tehdään lisääminen valintojen lisääminen koodissa. Lisää mainwindow-luokkaan alustusfunktio (initializeunitmap) ja kutsu sitä luokan rakentajan lopussa. ComboBoxiin uusien itemien lisääminen onnistuu funktiolla ui->sourcecombobox->additem( );
Esim. ui->sourcecombobox->additem( "metri" ); Alla olevan koodipätkän avulla tehtyä ComboBoxien alustuksen. #include <QMap> namespace typedef QMap<QString, float> ConvMap; // muunnettavat yksiköt, ensimmäinen yksikkö toimii refrenssinä // muiden arvo esitetään ensimmäisen yksikön "kertoimina" ConvMap convertibleunits; void MainWindow:initializeUnitMap() convertibleunits[ "metri" ] = 1; convertibleunits[ "maili" ] = 1609.344; convertibleunits[ "furlong" ] = 1609.344/8; convertibleunits[ "jalka" ] = 0.3048; convertibleunits[ "senttimetri" ] = 0.01; convertibleunits[ "tuuma" ] = 0.0254; for( ConvMap::const_iterator i = convertibleunits.constbegin(); i!= convertibleunits.constend(); ++i ) ui->sourcecombobox->additem( i.key() ); ui->resultcombobox->additem( i.key() ); 4. Viimeisenä osana on toteuttaa laskenta laskentanappulan painalluksen käsittelijään. Voit joko kysyä comboboxeilta suoraan niiden valittua itemiä (currenttext tai currentindex). Toinen vaihtoehto on luoda molemmille ComboBoxeille currentindexchanged -signaalin käsittelevä slot ja tallentaa käsittelijässä valittu arvo pääikkunan jäsenmuuttujaan (ja lisätä jäsenmuuttujat pääikkunaan). Jotain vinkkejä toteutukseen: Numeron (int, float) voi muuntaa Qstring-merkkijonoksi mm. seuraavasti: QString mjono = Qstring::number( numero ); LineEditin tekstin voi asettaa settext( QString ) funktiolla. Tässä esimerkki siitä, miten voit hakea qmapista QString-merkkijonoa vastaavan arvon. Arg1 voi olla esim. ComboBoxin valittu elementti (merkkijonona). ConvMap::ConstIterator it = convertibleunits.find( arg1 ); float conversionfactor = it.value();
valmis ohjelma (yksi mahdollinen käyttöliittymä) Nyt ohjelma on valmis, tarkista vielä ohjelman oikea toimivuus ja demoa sitä assarille niin saat suoritusmerkinnän. Lisätehtävä: lisää ohjelmaan yläkategorioita, kuten paino, etäisyys, tilavuus jne. Vaihda ComboBoxien muuntoyksiköt yläkategorian perusteella (valitaan paino, valittavana esim. pauna, muttei kilometrejä tai gallonaa). Miten toteuttaisit yläkategorian valinnan?