(H) Find-dialogi¶
Tavoite: Opin tekemään yksinkertaisen dialogin Qt Designerilla ja ymmärtämään Qt:n signals & slots -mekanismia.
Ohjeita:
Toteuta uusi projekti: student/12/find_dialog/
.
Luo uusi projekti edellisten materiaaliosioiden ohjeiden mukaisesti.
Tehtävänä on toteuttaa Qt Designerilla alla olevan kuvan mukainen dialogi.
Labelin Find from file
vieressä on lineEdit-komponentti, johon annetaan
sen tiedoston nimi, josta sanaa etsitään.
Vastaavasti labelin Find what
vieressä on lineEdit-komponentti,
johon kirjoitetaan etsittävä sana.
Kun Find
-nappulaa painetaan, sanaa etsitään annetusta tiedostosta.
Labelin Search status
alapuolelta löytyy textBrowser-komponentti,
jonne voit tulostaa tiedon siitä, löytyikö kyseinen tiedosto.
Jos tiedosto löytyi, voit taas tulostaa tiedon siitä, löytyikö
etsittävä sana vai ei.
Ohjelma tulostaa täsmälleen yhden alla olevista teksteistä:
File not found
File found
Word not found
Word found
Tuloste File not found
tulostetaan siis silloin, jos annettua
tiedostoa ei löydy.
Jos tiedosto löytyy, mutta jos etsittävää sanaa ei annettu
(eli se on tyhjä tai nollan merkin pituinen), tulostetaan
File found
.
Jos tiedosto löytyy ja jos etsittävä sana on jotakin muuta kuin
tyhjä, tulostetaan jompikumpi kahdesta viimeisestä vaihtoehdosta
sen mukaan, löytyikö tiedostosta vai ei.
Valintaruudussa Match case
voit määritellä, onko isoilla ja pienillä
kirjaimilla merkitystä vai ei.
Tämäkin valinta vaikuttaa siis siihen, kumpi kahdesta viimeisestä
tulostusvaihtoehdosta tulostetaan.
Käyttäjän tekemä valintaa ei kannata tallettaa boolean
-muuttujaan,
sillä QCheckBox
-luokalla on funktio isChecked
,
joka palauttaa tiedon valinnasta.
Nappulalla Close
voit sulkea pääikkunan (MainWindow).
Attention
Käytä seuraavia objektinimiä lineEdit-widgeteille:
fileLineEdit
ja keyLineEdit
.
Käytä näille widgeteille editingFinished
-signaaleja.
Käytä nappuloille nimiä:
findPushButton
ja closePushButton
.
Käytä lopuille widgeteille nimiä:
textBrowser
ja matchCheckBox
.
Halutessasi voit tehdä tehtävän seuraavissa vaiheissa:
Rakenna ensin kuvan mukainen dialogi. Kun olet luonut projektin edellisten materiaaliosioiden ohjeiden mukaan, Qt generoi osan luokkien koodista valmiiksi. Tiedostolistauksessa vasemmalla näkyy kohta Forms ja sen alla tiedosto
mainwindow.ui
. Klikkaamalla tämän tiedoston nimeä, pääset Qt Designeriin, jossa voit rakentaa dialogin raahaamalla sopivat käyttöliittymäkomponentit sopiville paikoille. Valitsemalla jonkin komponentin (joko piirtoalueelta tai oikealla olevasta Object-listasta) ja painamalla hiiren oikeanpuoleista nappia saat näkyviin valikon. Valitse valikostaChange objectName
antaaksesi objekteille Huom-laatikossa kerrotut nimet.Jos haluat mahdollisimman nopeasti päästää testaamaan toimintoja, voit seuraavaksi toteuttaa dialogin sulkemisen. Tämän voi tehdä Qt Designerissa avaamalla Signals & Slots Editorin. Plus-merkistä pystyt lisäämään signaaleja ja sloteja valikon avulla. Tarvittavat valinnat:
- Sender: Close-nappula
- Signal: clicked()
- Receiver: MainWindow
- Slot: close()
Tässä tuli siis jo määriteltyä yksi signal-slot -yhteys. Muiden yhteyksien tekeminen ei onnistu ihan näin yksinkertaisesti.
Seuraavaksi voit kokeilla, miten syötetiedoston nimen tai etsittävän sanan lukeminen onnistuu. Tässä tarvitaan jälleen signals & slots -mekanismia. Kun klikkaat lineEdit-komponenttia, avautuu valikko, josta voit valita
Go to slot ...
. Tällöin Qt generoi valmiiksi slot-funktion esittelynMainWindow.hh
-tiedostoon sekä vastaavan tyhjän funktionMainWindow.cpp
-tiedostoon. Kyseisen funktion rungon kirjoittaminen jää sinun vastuullesi.Lukemisen onnistumisen voit tarkistaa tulostamalla luetun tekstin
qDebug()
-virtaan, joka löytyyQDebug
-kirjastosta.Huomaa, että tarvittaessa voit kirjoittaa mitä tahansa C++-koodia valmiiksi generoituihin luokkiin. Voit lisätä luokkiin attribuutteja ja metodeja.
Kun olet varmistunut siitä, että saat talteen syötetyn sanan, voit toteuttaa etsintäalgoritmin. Siinä tarvitset normaalia C++-koodia, joka lukee tiedostosta tekstiä ja vertailee sitä toiseen tekstiin.
Toteuta lopuksi vielä
Match case
-toiminto.
Vinkkejä tehtävän tekemiseen:
- Tämän harjoituksen tekeminen pitäisi onnistua luennolla esitetyn esimerkin pohjalta. Jos et kuitenkaan ymmärtänyt yllä olevia vaiheita, kannattaa osallistua viikkoharjoituksiin tai käydä Kooditoriossa.
- Tiedoston avaamisen, sieltä lukemisen ja sulkemisen voit tehdä entiseen tapaan (graafiset käyttöliittymät eivät aiheuta tähän mitään eroa).
- Merkkijonon etsinnän voit tehdä haluamallasi tavalla, riittää
käyttää esim.
string
-luokan metodiafind
.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.