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.