Olio-ohjelmointi

Tehtävässä tutkitaan Qt-sovelluksen rakenteita. Tässä siis hyödynnetään Qt Frameworkin ominaisuuksia.

Lue sivun https://peatutor.com/qt/ materiaalista, mikä on luokan QObject tarkoitus, ja mihin tarvitaan makroa Q_OBJECT.

Harjoitus6 (Qt-konsolisovellus)

HUOM!: Luo kullekin luokalle erillinen h-tiedosto ja cpp-tiedosto.

Rakenna tämän tehtävän sovellus luomalla sovellus, jonka tyyppinä on Qt-Console hyödyntäen Qt Creatorin ominaisuuksia.

Luo projekti nimeltään h6 ja valitse nyt tyypiksi Application (Qt)->Qt Console Application

  1. Tutki sovelluksen CMakeLists.txt-tiedostoa ja main.cpp-tiedostoa
  2. Lisää sovellukseen luokka ExampleClass (Qt Creatorin "Add New->C++ Class"). Kun luot luokan rastita
    • Include QObject
    • Add Q_OBJECT
    Ja periytä ExampleClass luokasta QObject,
  3. Lisää luokkaan: (h-tiedostoon)
    1. public metodi void startToWait();
    2. signals osioon signaali void readyToSay();
    3. private slots osio ja siihen metodi void sayHelloSlot();
    4. Lisää #include <QThread>
  4. Kirjoita metodien startToWait() ja sayHelloSlot() toteutukset (cpp-tiedostoon)
    1. startToWait() -metodiin seuraava koodi:
      QThread::msleep(1000);
      emit readyToSay();
      
    2. sayHelloSlot() -metodiin seuraava koodi:
      qDebug()<<"Terve";
      
  5. Kirjoita luokan muodostimeen rivit:
    qDebug()<<"Start";
    connect(this, &ExampleClass::readyToSay, this, &ExampleClass::sayHelloSlot);
    qDebug()<<"End";
    
  6. Luo main.cpp:ssä luokan ExampleClass-olio ja kutsu sen metodia startToWait
  7. Testaa sovellustasi

Huom! qDebug toimii myös näin qDebug("Terve");, mutta yllä oleva tapa on uudempi.

Huomioita sovelluksesta

Edellä haluttiin käyttää luokassa ExampleClass Qt:n signal/slot mekanismia, joten

  • ExampleClass luokan tulee periä luokka QObject
  • ExampleClass luokassa tulee suorittaa Q_OBJECT makro
  • ExampleClass luokan konstruktori ExampleClass(QObject* parent = nullptr), mahdollistaa sen, että luokan oliolle voidaan asettaa ns. parent olio. Tässä tehtävässä ominaisuutta ei hyödynnetä.
  • lauseella emit readyToSay(); "nostetaan" readyToSay, niminen signaali
  • lauseella connect(this, &ExampleClass::readyToSay, this, &ExampleClass::sayHelloSlot); readyToSay signaali kytketään slottiin sayHelloSlot

Konsolisovelluksessa qDebug toimii kuten cout. Graafisissa sovelluksissa qDebuggia voidaan käyttää tulostamaan tekstiä Qt-Creatorin Output ikkunaan. Näitä sanomia ei siis näytetä loppukäyttäjille.

Tehtävän tarkoitus on havainnollistaa kuinka signal/slot systeemi toimii. Tässä metodi startToWait edustaa metodia, joka suorittaa tehtävää, jonka valmistumista ei voida ennakoida. Kun se saa työnsä valmiiksi, se emitoi readyToSay signaalin.

Qt-frameworkin signal-slot systeemi korvaa peristeisten callback funktioiden tarpeen.

Callback-funktiot

Callback-funktiot ovat ohjelmoinnissa funktioita, jotka annetaan parametreina toisille funktioille. Ne suoritetaan myöhemmin, yleensä tietyn tapahtuman tai operaation valmistuttua. Callback-funktioiden avulla voidaan toteuttaa asynkronisia toimintoja, kuten tiedon hakemista palvelimelta tai käyttäjän syötteiden käsittelyä.

Makro

Makro C++-ohjelmoinnissa on esikäsittelijäohje, joka määritellään käyttämällä #define-lausetta. Makrot korvataan koodissa ennen varsinaista kääntämistä. Niitä käytetään esimerkiksi vakioiden, funktiokoodin tai koodimallien lyhentämiseen.

Q_OBJECT-makro itsessään ei sisällä suoritettavia toimenpiteitä, vaan se toimii osana Qt:n esikäsittelyä. Se ainoastaan kertoo Qt:n työkaluille, että tämä luokka sisältää Qt:n erikoisominaisuuksia ja että sille tulee luoda lisäkoodia.



Toggle Menu