Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Harjoitustehtävät Qt:n ja C++:n oppimiseen. Jokainen tehtävä on 2 pisteen arvoinen. Näytä opettajalle tekemäsi tehtävä, niin saat pisteet kotiin. Pisteet lisätään saamiisi kokeen pisteisiin. Kurssin kokonaispistemäärä on noin 100 ja sillä saa vitosen. Noin 50 pisteellä saa ykkösen. Tutustu kurssin oppimateriaaliin, sieltä löytyy moneen tehtävään miltei valmis ratkaisu. Lisäksi Qt:n omat sivut ovat erittäin hyvä oppislähdeoppimislähde, niihin kannattaa tutustua.   Näiden tehtävien yksi tärkeä tehtävä on opettaa opiskelijaa käyttämään Qt:n help-sivustoja, joten kaikki tehtävien yhteydessä olevat linkit kannattaa käydä läpi.

  1. Tee Qt Creator ohjelmalla dialogi-sovellus. Laita dialogiin liukupalkki ja "lcd"-näyttö QLCDNumber. Johda liukupalkin signaali (valueChanged) "lcd"-näytön slotiin (display) signal-slot tilassa (F4). Tee graafisella editorilla kytkennät "widgettien" välille. Testaa sovellus.
  2. Tee edellinen tehtävä connect-funktion avulla eli lisää Dialogin muodostimeen connect.... Alla esimerkki connect-funktion käytöstä:
    Code Block
        Dialogi::Dialogi(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialogi)
        {
          ui->setupUi(this);//tämä on jo tehty puolestasi automaattisesti
          //yhdistetaan signaalit ja slotit, valitse komponentit valikosta ALÄ KOPIOI ettei mene suteen
          //ui-> tarkoittaa sitä, että komponentti on käyttöliittymässä ja ui-> on osoite käyttöliittymään
          connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->lcd,SLOT(display(int)));
          ....
    
  3. Laita graafisessa editorissa edellisen liukupalkin alarajaksi -100 ja ylärajaksi 100. Testaa.
  4. Vie liukupalkin arvo edistymispalkin " QProgressBar " arvoksi. Tee kytkentä graafisella editorilla.
  5. Tee edellinen tehtävä connect-funktiolla samaan tapaan kuin tehtävässä kaksi.
  6. Tässä tehtävässä viet haluamasi tekstin labeliin eli tekstinäyttöön ruudulla, kun painat dialogissa olevaa nappulaa. Eli tee dialogi, johon luot graafisessa editorissa  painonapin ja labelin. Nimeä nappi ja label siten, että muistat niiden merkityksen. Tee lisäksi painonapille slot siirtämällä hiiren kursori napin päälle ja painamalla hiiren oikeaa painiketta ja sieltä valinta: go to slot . Tee .h-tiedostoon oma slot seuraavasti eli avaa Dialog.h ja aaltosulkeiden sisälle ennen lopettavaa sulkua lisää alla oleva teksti.Jos ei muistu mieleen slotit ja signaalit, niin katso täältä: ohjeita signaaleista ja sloteista
    Code Block
    ...
    public slots:
        void nayta();
    ...
    
    Tee slotin toteutus tiedostoon Dialog.cpp. Lisää tiedoston loppuun funktio, joka näyttää tekstin label ruudulla.
    Code Block
    //tämän lisäät Dialog.cpp tiedoston loppuun
    void Dialog::nayta()
    {
        //laita ui-> jos olet tehnyt labelin dialogiin
        QString Tekstia;//tämä on muuttuja joka tallettaa merkkijonoja
        Tekstia="juttuja";
        ui->label->setText(Tekstia);//tällä laitat tekstin labeliin
    }
    
    Liitä napin signaali omaan slotiisi. Tee tämä dialogin muodostimessa (slot on nyt Dialogissa).
    Code Block
    ui->setupUi(this);//tämä on jo tullut automaattisesti
    //yhdistetaan signaalit ja slotit, valitse komponentit valikosta ALÄÄLÄ KOPIOI ettei mene suteen
    //this alla tarkoittaa, että vastaanottaja on tämän tiedoston (luokan) slot
    connect(ui->Nappi,SIGNAL(clicked()),this,SLOT(nayta()));
    
  7. Tässä tehtävässä on tarkoituksena tehdä sekuntikello, jonka voi käynnistää, laittaa tauolle, käynnistää uudelleen ja pysäyttää nappien avulla.   Kello toteutetaan QTimer-luokan avulla (tutustu QTimer linkin alta löytyvään tekstiin!!!). Tee dialogiin painikkeet start, pause, jatka, stop ja nollaus. Tee painikkeille slotit (go to slot) sekä vielä lcd-näyttö kellon arvoa varten. Tee QTimer timer; muuttuja Dialog.h tiedostoon alla olevan esimerkin mukaisesti.  
    Code Block
    #include <QDialog> // tämä on jo
    #include <QTimer>  //lisää tämä, tähänhän jo tutustuit QTimer helpissä
    
        ... lisää seuraavat muuttujat luokkamäärittelyyn
        ~Dialog();// tämä on jo tehty puolestasi automaattisesti
        QTimer timer;//ajastin ajan laskentaa varten, tämä rivi sinun täytyy lisätä
        int laskuri;//laskuri joka laskee ajastimen timeout eli kertoja jotka ajastin on käynyt loppuun
        ...
        private slots:
        void on_StopTimer_clicked();//tämä tuli automaattiseti kun teit Stop painikkeen ja sille slotin "go to slot" määrittelyllä
        void on_StartTimer_clicked();//ja tuli kanssa samalla tavoin
        void PaivitaNaytto();//tämän joudut tekemään itse ja vastaavan funktion Dialog.cpp tiedostoon
    };
    
    Nyt timer on muuttuja, joka sisältää ajastimen. Esimerkiksi timer.start(1000) käynnistää ajastimen yhden sekunnin resoluutiolla. Ajastimen timeout signaalin joudut kiinnittämään itse tekemääsi slotiin PavitaNaytto seuraavasti Dialogin muodostimessa, muistathan että muodostin on se jossa luokan nimi on sama kuin funktion nimi.
    Code Block
    ui->setupUi(this);//tämä on jo Dialogin muodotimessa
    //tämän liitynnän ajastimen timeout signaalista ja  PaivitaNaytto
    //& merkki tarkoitaa siirtymistä muuttujasta osoitteeseen
    //eli timer on muuttuja &timer on muuttujan osoite
    connect(&timer,SIGNAL(timeout()),this,SLOT(PaivitaNaytto()));
    
    Ja sitten vielä funktioiden sisällöt Dialog.cpp tiedostoon. Muistathan, että teit funktioiden rungot "go to slot" mekanismilla.
    Code Block
    void Dialog::on_StartTimer_clicked()//tämän olet tehnyt "go to slot" määrittelyllä
    {
        timer.start(100);
        laskuri=0;
    }
    
    void Dialog::on_StopTimer_clicked()//tämän olet tehnyt "go to slot" määrittelyllä
    {
        timer.stop();
    }
    //ja tähän ilmestyy loptloput napit, kun teet ne "go to slot" määrittelyllä
    
    //ajetaan läpi timeoutista eli tämän teet itse
    void Dialog::PaivitaNaytto()
    {
        laskuri++;
        ui->lcdNumber->display(laskuri);
    }
    
    Lisää vielä sisällöt funktioille Jatka ja Pause sekä tee kaikki tarvittavat funktiot ja testaa ohjelma.
  8. Muuta edellisen tehtävän kelloa siten, että tarkkuus on 0.01 sekuntia. Eli joudut muuttamaan timerin start-asetusta. kts. QTimer help
  9. Muuta edellisen tehtävää siten, että nyt on vain painonapit start/pause, stop ja nollaus. Eli muuta start/pause-napin tekstiä sen mukaan onko ajastin tilassa käynnissä/pysäytettynä. Huom! tarvitset luokkaan muuttujan, jossa pidät yllä laskurin tilaa.
  10. Muuta edellistä tehtävää siten, että voit muuttaa tarkkuutta vaikka spinBox "widgetillä".
    Code Block
    void Dialog::on_StartTimer_clicked()
    {
        int aika= ui->spinBox->value();
        timer.start(aika);
        laskuri=0;
    }
    
  11. Tee ohjelma, joka sisältää painonapin "PushButton" ja viesti-ikkunan "MessageBox". Kun painetaan nappia, ohjelma näyttää viestiruudulla "MessageBox" viestin "nappia painettu".
  12. Vie edellisen tehtävän teksti QLabel ikkunaan.
  13. Vie edellisen tehtävän teksti QLineEdit ikkunaan
  14. Tutustu Qt:n QDebug luokkaan ja tulosta sen avulla edellisen tehtävän teksti komentoikkunaan.
  15. Tee ohjelma, joka ilmoittaa millä välillä annettu luku on. Laita annettu arvo lineEdit "ikkunaan" ja nappia "pushButton" painettaessa testaa if-lauseella arvoalue. Aseta "RadioButton"in  (yhden kolmesta) arvo osoittamaan arvoväliä 0...10, 11...100 tai >100.
  16. Vie liukupalkin data muuttujaan ja testaa debugerilla ja breakpointin avulla, että siirto onnistui. ohjeita
  17. Tee Radio button valikko kolmella painikkeella dialogiin. Lisää teksiruutu, jossa kerrot mitä painikkeista on painettu.
  18. Tee ohjelmallisesti dialogi, jossa on oikealla plus-, miinus-, kerto- ja jakopainikkeet. Vasemmalla on kolme teksti-ikkunaa, kahden ylimmän ruudun tulos laitetaan alimpaan ruutuun riippuen painettavasta napista. Lisää tekstikenttiin validaattorit, ettei numerokenttiin voi syöttää kirjaimia kts. mallia esimerkistä double validator.
  19. Tee dialogi, jossa on progress bar, joka etenee ajastimen tahdissa. Progress barin voi käynnistää, nollata ja pysäyttää painikkeilla. Laita ajastimen jaksoajaksi 0,5 sekuntia. Näytä arvo myös "lcd"-näytöllä.
  20. Tee graafisella editorilla dialogi, johon sijoitat kuusi haluamaasi widgettiä ja erottele rinnakkaiset widgetit spacerilla toisistaan. Ryhmittele widgetit kolmeen allekkaiseen ryhmään kolmella horisonttaalisella layoutilla.
  21. Jatka edellistä tehtävää siten, että teet groupboxin rinnakkaisten widgettien ympärille ja ylimmän ryhmän napilla kätket alemmat widget-ryhmät. Kokeile sizehint käskyä muotoillaksesi dialogia oikean kokoiseksi.
  22. Tee dialogi graaffisella editorilla.
  23. Tee dialogi esimerkki, jossa pino on aliluokkana. Tee nappula "Laita pinoon" ja "Ota pinosta".
  24. Tee edellinen esimerkki QStack template luokkaa käyttäen.
  25. Tee dialogi, jolla voit laittaa ja katsella lukuja vektorissa, käytä QVector objektia.
  26. Tee dialogi, jolla voit laittaa ja katsella lukuja vektorissa, käytä QList objektia.

...