QT – WEBINAR: Getting Started with Qt/C++ Programming. Parte 2

La scorsa volta ci siamo lasciati alla gestione degli eventi. Ecco cosa ci propone QT.

QT gestione eventi

Le QT usano gli SLOT e i SIGNAL per la comunicazione ad alto livello con l’utente (ad esempio il movimento del mouse o la pressione di un bottone…proprio quello che vogliamo noi 🙂 ). I virtual method sono invece usati per interazioni a basso livello con il sistema operativo o ad esempio la pressione dei tasti… su una tastiera naturalmente.
Quindi il funzionamento di SLOT e SIGNAL è molto semplice. Un oggetto emette un segnale (il SIGNAL) e un altro risponde al segnale con una funzione particolare (lo SLOT).
La connessione tra i due viene fatta usando la funzione connect che appartiene alla classae QObject. I parametri della connect sono i seguenti (copiati dall’help QT):

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection ) [static]

Come farli funzionare nel nostro esempio della volta scorsa? Il sender e l’evento lo abbiamo, ci mancano il receiver e il metodo di risposta… almeno per il bottone “Ciao”. Perché per il bottone “Esci” useremo un artificio 🙂

Il codice è il seguente:

Eventibottoni.h

#ifndef EVENTIBOTTONI_H
#define EVENTIBOTTONI_H

#include <QObject>

class EventiBottoni : public QObject
{
    Q_OBJECT

public slots:
    void rispondiButton1();

};

#endif // EVENTIBOTTONI_H

Eventibottoni.cpp

#include <QMessageBox>

#include "eventibottoni.h"

void EventiBottoni::rispondiButton1()
{
    QMessageBox::information(0, QObject::tr("Messaggio"), QObject::tr("Ciao, mondo!!"));
}

main.cpp

#include <QApplication>
#include <QtGui>

#include "eventibottoni.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget window;

    QPushButton *button1 = new QPushButton("Ciao", &window);
    QPushButton *button2 = new QPushButton("Esci", &window);
    QHBoxLayout *layout = new QHBoxLayout(&window);

    layout->addWidget(button1);
    layout->addWidget(button2);

    EventiBottoni eventi;

    QObject::connect(button1, SIGNAL(clicked()), &eventi, SLOT(rispondiButton1()));
    QObject::connect(button2, SIGNAL(clicked()), qApp, SLOT(quit()));

    //window.setLayout(layout);
    window.show();

    return a.exec();
}

E questo è il risultato:

Pulsante ciao

Allora come si vede abbiamo dovuto generare un oggetto derivante da QObject in cui definire il metodo di risposta alla pressione del tasto “Ciao”. L’oggetto deve forzatamente derivare da QObject pena il non poter definire la connect. Se vi chiedete il perché guardate la definizione della funzione 🙂 l’ho messa a posta all’inizio.

L’artificio per il bottone “Esci” invece è semplice 🙂 ho definito una connessione verso l’oggetto qApp (che non abbiamo definito noi) ma è definito dalle QT ed è un puntatore globale all’oggetto applicazione. Per cui diciamo all’applicazione di chiudersi chiamando lo slot quit().

Ok Siamo quasi arrivati alla fine, il webminar era di soli 45 minuti, manca solo un punto da chiarire. Quel “Q_OBJECT” che vedete in mezzo alla classe abilita il MOC, cioè il Meta object compiler. Diciamo che è il traduttore di alcune feature QT verso codice standard C++ ad esempio converte le funzioni signals e slots in codice C++ al momento della compilazione. Un sunto lo trovate nell’immagine di seguito:

MOC

Il mio prossimo webinar sarà il 13 di marzo 🙂 per cui potete stare tranquilli per un po’. 😛

Posta un commento o usa questo indirizzo per il trackback.

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.