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’. :P

About these ads
Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 63 follower

%d blogger cliccano Mi Piace per questo: