(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.

../../_images/find_dialog.png

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 valikosta Change 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 esittelyn MainWindow.hh-tiedostoon sekä vastaavan tyhjän funktion MainWindow.cpp-tiedostoon. Kyseisen funktion rungon kirjoittaminen jää sinun vastuullesi.

    Lukemisen onnistumisen voit tarkistaa tulostamalla luetun tekstin qDebug()-virtaan, joka löytyy QDebug-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 metodia find.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.