Konekirjoitusta

Esimerkki on tarkoitettu avuksi tämän kierroksen projektin toteuttamista varten. Se löytyy hakemistosta examples/12/typewriter2.

Ohjelmassa on painonapit kirjaimille A-Z ja numeroille 0-9. Kun jotakin kirjainta tai numeroa klikataan, kyseinen merkki tulostuu textBrowser-widgettiin. Lisäksi ohjelmassa on Clear-nappula, jolla textBrowser-widgetin voi tyhjentää ja aloittaa kirjoittamisen alusta.

Tämä on myös esimerkki siitä, miten käyttöliittymäelementtejä voidaan luoda koodissa (ilman että niitä raahattaisiin ja pudotettaisiin .ui-tiedostossa). Lisäksi esimerkissä näytetään, miten käyttöliittymäkomponenteille voidaan asettaa värejä.

Esimerkistä on hyötyä projektin toteuttamisessa, jos tarvitset ison määrän painonappeja.

Painonappien luominen ja sijoittelu koodissa

Tähän mennessä olemme .ui-tiedostossa määritelleet widgettejä, joihin on yksitellen liitetty signaalit ja slotit. Tässä ohjelmassa painonappeja on kuitenkin aika paljon: kirjaimille 26 kpl ja numeroille 10 kpl. Näin suurelle määrälle painonappeja olisi työlästä yhdistää klikkaus ja sen käsittelevä slot yksitellen toisiinsa. Lisäksi slotit olisivat samanlaisia keskenään, mikä johtaisi toisteiseen koodiin.

Järkevämpää on kutsua connect-metodia silmukassa. Tämä on tehty erikseen kirjaimille ja numeroille metodeissa init_alphabets ja init_numbers.

Myös itse painonapit luodaan ohjelmallisesti näissä silmukoissa eikä .ui-tiedostossa. Kirjaimiin liittyvät alustukset on tehty metodissa init_alphabets. Kirjainnappulat luodaan ja sijoitellaan ruudukkotaittoon (QGridLayout), vaikkakin ne asetellaan vaakasuoraan riviin. Qt:ssa olisi mahdollisuus käyttää myös vaakasuoraa tai pystysuoraa taittoa (QHBoxLayout ja QVBoxLayout), mutta ruudukkotaitto on näistä monipuolisin, sillä se mahdollistaa kaikki vaihtoehdot (vaakasuoran, pystysuoran ja ruudukon).

Numeroihin liittyvät alustukset on tehty metodissa init_numbers. Vertailun vuoksi tässä ei ole käytetty taittoa, vaan painonapit on sijoiteltu suoraan pääikkunaan antamalla koordinaatit. Tämä tapaa vaatii hieman enemmän laskemista, mutta toisaalta tällöin widgettien sijoittelua on helpompi hallita.

Kun mietit, kannattaako jossakin ohjelmassa käyttää taittoa vai ei, ota huomioon se, että taittoa käyttäessäsi ui-tiedostoa ei voi käyttää. Tässä esimerkissä ui-tiedosto on mukana, mutta sitä ei ole käytetty, joten sen olisi voinut jättää kokonaan pois.

Klikkausten käsittely

Ohjelmassa on slot handle_character_click, joka käsittelee sekä kirjain- että numeronäppäinten klikkaukset. Koska kyseinen slot on yhteinen käsittelijä monelle eri painonapille, siinä pitää selvittää, mitä painonappia klikattiin. Tässä on hyödynnetty QObject-luokalta periytyvää sender-metodia, joka palauttaa osoittimen siihen olioon, joka lähetti signaalin. Kirjain- ja numeronäppäimet (tai osoittimet niihin) löytyvät vektoriattribuutista buttons_, joten riittää käydä läpi tämä vektori ja vertailla, onko tarkasteltava vektorin alkio sama kuin signaalin lähettänyt olio.

Kun sopiva painonappi on löytynyt, vektorin läpikäynti voidaan lopettaa. Enempää sopivia painonappeja ei voi löytyä, koska vain yhtä nappulaa voi kerrallaan klikata. Metodissa oleva return-lause on siis mukana vain tehokkuussyistä, eikä se muuten vaikuta ohjelman toimintaan.

Värien asettaminen

Kirjainnappuloille on asetettu väri määrittelemällä ensin suti (QBrush) ja paletti (QPalette). Tämän jälkeen paletti asetaan kullekin kirjainpainonapille for-silmukassa. Qt:ssa on valmiiksi määriteltyjä vakioita yleisimmille väreille. Lisää värejä löytyy luokasta QColor (https://doc.qt.io/qt-5/qcolor.html). Kohdasta “Predefined Colors” löytyy esimääritellyt värit.

Numeronäppäimille on asetettu väri yksinkertaisemmalla tavalla eli metodilla setStyleSheet. Metodille annetaan parametriksi QString, joka sisältää värimäärittelyn. Vaihtoehto background-color värittää koko painonapin. Pelkkä color värittää vain painonapin tekstin, kuten on tehty Clear-nappulalle.

Sekä taustavärin että tekstin värin asettaa samalla kutsulla esimerkiksi setStyleSheet("background-color: blue; color: yellow").