Konekirjoitusta

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

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 .ui-tiedostossa).

Esimerkistä on hyötyä projektin toteuttamisessa, jos toteutat pelikortit painonappeina. Tällöin kortin voi kääntää klikkaamalla sitä.

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 riveillä 89-90 sekä riveillä 120-121.

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 horisontaaliseen taittoon (QHBoxLayout), jolloin ne tulevat automaattisesti vaakasuoraan riviin. Jos haluat projektissa asetella kortit vastaavalla tavalla, voit käyttää ruudukkotaittoa (QGridLayout).

Numeroihin liittyvät alustukset on tehty metodissa init_numbers. Vertailun vuoksi tässä ei ole käytetty taittoa, vaan painonapit on sijoiteltu antamalla koordinaatit. Metodissa on myös käytetty QGraphicsView-widgettiä, mikä ei olisi ollut mitenkään välttämätöntä. Kyseinen widgetti on tarkoitettu alueeksi, johon voi asetella erilaisia kuvioita (esimerkiksi ellipsejä ja suorakulmioita), mutta tässä sitä on käytetty reunustamaan numeronappuloita. (Liikkuvan ympyrän esimerkissä näkyy, miten QGraphicsView-widgettiä voidaan paremmin käyttää.)

Klikkausten käsittely

Ohjelmassa on slotit handleLetterButtonClick ja handleNumberButtonClick. Nämä toimivat hyvin samalla tavalla, erona on vain se, mistä vektorista painonapit löytyvät ja mitä merkkejä on tarkoitus tulostaa. Siksi toisteisen koodin välttämiseksi slotien varsinainen toiminnallisuus on kirjoitettu metodiin handle_character_click, jota molemmat slotit kutsuvat sopivilla parametreilla. (Tässä sloteille ja tavallisille metodeille on käytetty erilaista nimeämistyyliä.)

Metodi handle_character_click on yhteinen käsittelijä monelle eri painonapille. Siksi siinä pitää selvittää, mitä painonappia klikattiin. Tämä tapahtuu etsimällä kursorin (hiiren) koordinaatit, jossa klikkaus tapahtui. Luokan QCursor metodi pos palauttaa globaalit koordinaatit, jotka kertovat sijainnin suhteessa koko näyttöön.

Tarvitaan kuitenkin lokaalit koordinaatit, jotka kertovat sijainnin MainWindow-ikkunan sisällä. Ne saadaan vähentämällä globaaleista koordinaateista MainWindow-ikkunan (tai -luokan) koordinaatit. Tämän jälkeen voidaan vain käydä parametrina saatu vektori läpi ja etsiä sieltä painonappi, joka sisältää lokaalit koordinaatit.

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.