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")
.