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:
mySignal
mySlot
, joten kun signaali nousee, funktio mySlot
suoritetaanvoid myAsyncFunction(); QString valueFromAsync;Ja private slots-osaan
void mySlot();Ja tiedoston loppuun
signals: void mySignal();
void MainWindow::myAsyncFunction() { QThread::msleep(3000); valueFromAsync="Data from AsyncFunction"; emit mySignal(); qDebug()<< "Async function finish"; } void MainWindow::mySlot() { ui->labelInfo->setText(valueFromAsync); }
#include <QDebug> #include <QThread>
connect(this, SIGNAL(mySignal()), this, SLOT(mySlot())); myAsyncFunction();