venerdì 19 agosto 2011

Qt: il protocollo signal/slot

Il compilatore moc produce un file speciale, moc_nomeclasse.cpp (e il relativo compilato), per ogni file sorgente che includa segnali e/o slot. Analizzare e debuggare il codice in esecuzione è un buon esercizio per comprendere cosa il sistema Qt faccia dietro alle quinte.
Per questo ho creato due classi molto semplici, una Signal con tre semplici segnali:

void integerSignal(int emittingValue);
void voidSignal();
void floatSignal(float emittingFloatValue);

e una classe Slot con i relativi slot (e le loro semplici implementazioni):


// slot per ricezione di un segnale
// che accetta un parametro intero
void Slot::integerSlot(int emittedValue){
printf("\nSegnale intero ricevuto %d\n", emittedValue);
}
// slot per la ricezione di un segnale senza argomenti
void Slot::voidSlot(){
printf("\nSegnale void ricevuto\n");
}


Anzitutto, osservando i file prodotti dal moc compiler, si nota che gli oggetti sono identificati da una stringa che identifica anche i nomi simbolici degli slot/signal presenti (e i relativi nomi simbolici dei parametri):

//moc_signal.cpp
static const char qt_meta_stringdata_Signal[] = {
"Signal\0\0emittingValue\0integerSignal(int)\0"
"voidSignal()\0emittingFloatValue\0"
"floatSignal(float)\0"
};

// moc_slot.cpp
static const char qt_meta_stringdata_Slot[] = {
"Slot\0\0emittedValue\0integerSlot(int)\0"
"voidSlot()\0"
};

La prima parte della stringa rappresenta una sorta di intestazione, ovvero indica se quello che segue è relativo a segnali o slot.

Nessun commento: