Home / Programmazione / C - C++ / Qt, signal e slot
Mattepuffo

Qt, signal e slot

Qt, signal e slot

Ho cominciato lo sviluppo di un programmino in C++ e le Qt.

Con Qt-Creator, l'IDE ufficiale per lo sviluppo cone le Qt, ho creato un progetto Qt Widget Project -> Qt Gui Application.

Mi sono ritrovato con una QWindow e dall'editor grafico ho aggiungo due QAction al menu.

A questo punto il problema era: come fare a collegare un'azione/evento alla voce del menu (QAction)?

Bene, vediamo come fare.

I file che ci interessano sono mainwindow.h e mainwindow.cpp.

In pratica dobbiamo aggiungere una funzione che poi collegheremo alla QAction.

Inizialmente i file erano questi:

    #ifndef MAINWINDOW_H

    #define MAINWINDOW_H

    #include <QMainWindow>

    namespace Ui {

        class MainWindow;

    }

    class MainWindow : public QMainWindow

    {

        Q_OBJECT

    public:

        explicit MainWindow(QWidget *parent = 0);

        ~MainWindow();

    private:

        Ui::MainWindow *ui;

    };

    #endif // MAINWINDOW_H

    #include "ui_mainwindow.h"

    #include "mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :

        QMainWindow(parent),

        ui(new Ui::MainWindow)

    {

        ui->setupUi(this);

    }

    MainWindow::~MainWindow()

    {

        delete ui;

    }

I file predefiniti dopo la creazione del progetto.

A questo punto dobbiamo creare una funzione che venga eseguita al click sulla voce del menu (o all'esecuzione della scorciatoia da tastiera che è possibile impostare anche dall'editor grafico).

I file diventano così:

    #ifndef MAINWINDOW_H

    #define MAINWINDOW_H

    #include <QMainWindow>

    namespace Ui {

        class MainWindow;

    }

    class MainWindow : public QMainWindow

    {

        Q_OBJECT

    public:

        explicit MainWindow(QWidget *parent = 0);

        ~MainWindow();

    private:

        Ui::MainWindow *ui;

    private slots:

        void closeProgram();

    };

    #endif // MAINWINDOW_H

    #include "ui_mainwindow.h"

    #include "mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :

        QMainWindow(parent),

        ui(new Ui::MainWindow)

    {

        ui->setupUi(this);

        connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(closeProgram()));

    }

    void MainWindow::closeProgram()

    {

        exit(0);

    }

    MainWindow::~MainWindow()

    {

        delete ui;

    }

Nel file di intestazione abbiamo aggiungo uno Slot, che viene "chiamato" quando viene emesso un segnale.

Nel file cpp invece abbiamo implementato la funzione (che altro non fa che chiudere il programma) e abbiamo connesso lo Slot alla QAction.

Tutto ciò con questa riga:

connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(closeProgram()));

Il primo parametro è il sender; nel nostro caso la QAction.

Il secondo parametro è il tipo di SIGNAL (segnale).

Il tezo parametro è il receiver; in questo caso la finestra che possiede anche i componenti.

Il quarto parametro è lo SLOT, che sono praticamente identici alle funzioni membro di una classe.