Qt-ohjelmointi
Signals & Slots

Signaalien ja Slottien avulla oliot voivat kommunikoida keskenään. QObject-luokan connect-funktiolla ensimmäisen olion signaali-funktio voidaan kytkeä toisen olion slot-funktioon.

connect-funktion syntaksi on seuraava

QObject::connect(object1, SIGNAL(signaali-funktio), object2, SLOT(slot-funktio) );

connect()-funktiolla on siis neljä parametriä: lähettäjä, lähettäjän signaali, vastaanottaja ja vastaanottajan slot.

Signaalin ja slotin välinen yhteys voidaan poistaa. Poistamista tarvitaan harvoin, sillä Qt purkaa yhteyden olion tuhoutuessa. Purkaminen tapahtuu kutsumalla disconnect()-funktiota samoilla parametreillä, millä connect()-funktiotakin kutsuttiin.

Qt:n Signals ja slots systeemi korvaa callbackien käytön. Sitä voidaan käyttää siis esimerkiksi asynkronisten-funktioiden kanssa. Seuraavassa harjoituksessa ideana on, että asynkroninen funktio myAsyncFunction asettaa muuttujalle valueFromAsync arvon ja kun se on tehty arvo tulostetaan labeliin. Koska kyseessä on asynkroninen funktio, tulostamista ei voi tehdä suoraviivaisesti. Suoritus etenee seuraavasti:

  1. Kun asynkroninen funktio on tehnyt tehtävänsä se nostaa signaalin mySignal
  2. Signaali on kytketty Slottiin mySlot, joten kun signaali nousee, funktio mySlot suoritetaan
Asynkronista funktiota simuloidaan harjoituksessa asettamalla funktioon 3 sekunnin viive funktiolla msleep.

  1. Tee QtWidget sovellus(nimeltään signalSlot), jossa button ja label(=labelInfo)
  2. Luo buttonille clicked tapahtumalle Slot
  3. Lisää mainwindow.h tiedoston public osaan
    void myAsyncFunction();
    QString valueFromAsync;
    
    Ja private slots-osaan
    void mySlot();
    
    Ja tiedoston loppuun
    signals: 
        void mySignal();
    
  4. Lisää mainwindow.cpp:hen
    void MainWindow::myAsyncFunction()
    {
        QThread::msleep(3000);
        valueFromAsync="Data from AsyncFunction";
        emit mySignal();
        qDebug()<< "Async function finish";
    }
    
    void MainWindow::mySlot()
    {
        ui->labelInfo->setText(valueFromAsync);
    }
    
  5. Lisää mainwidow.h tiedostoon rivit
    #include <QDebug> 
    #include <QThread>
    
  6. Lisää buttonin Slottiin
    connect(this, SIGNAL(mySignal()), this, SLOT(mySlot()));
    myAsyncFunction();   
    
  7. Testaa, että sovellus toimii.



Toggle Menu