概要
シグナルおよびスロットの詳細は、以下のWebサイトを参照すること。
https://blog.qt.io/jp/2010/07/20/create-signals-and-slots-2
シグナルとスロット
connect関数を使用して、シグナルとスロットの設定を行う。
 connect(sender, SIGNAL(signal), receiver, SLOT(slot));
以下に、connenct関数の引数の意味を記載する。
- sender
- 信号が発生するコントロールIDまたはクラスのアドレスを渡す。
 
- SIGNAL(signal)
- signalに信号とする関数名を渡す。
- 例: プッシュボタンの場合、SIGNAL(clicked())と記述する。
 
- receiver
- 信号を受信するコントロールIDまたはクラスのアドレスを渡す。
 
- SLOT(slot)
- 信号を受信した時に呼び出す関数名を渡す。
 
connect関数の使用方法
 #include "mainwindow.h"
 #include <QApplication>
 #include <QPushButton>
 
 int main(int argc, char *argv[])
 {
    QApplication app(argc, argv);
 
    QPushButton* button = new QPushButton("Quit");
    QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
    button->show();
 
    return app.exec();
 }
静的メンバ関数のconnect
静的メンバ関数は、インスタンスを生成せずに実行することができる。
通常のメンバ関数の呼び出しと同様、thisからシグナルを発信して、thisでシグナルを受ければよい。
また、送信側と受信側の両方がthisの場合、受信側インスタンスの指定を省略できるconnectのオーバーロード関数も存在する。
以下の例では、コンストラクタでシグナルとスロットを接続して、画面が表示された時、showEventメソッドでシグナルをemitしている。
また、送信側のクラスのインスタンスは生成していない。
 // MainWindow.cpp
 
 #include "MainWindow.h"
 #include "ui_MainWindow.h"
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
 {
    ui->setupUi(this);
 
    connect(this, &MainWindow::testSignal1, this, &QObjectEx::staticSlot);
    connect(this, &MainWindow::testSignal2, this, &QObjectEx::staticSlot);
 }
 
 MainWindow::~MainWindow()
 {
    delete ui;
 }
 
 void MainWindow::showEvent(QShowEvent *event)
 {
    QMainWindow::showEvent(event);
 
    emit testSignal1(10);
    emit testSignal2(20);
 }
 // MainWindow.h
 
 #pragma once
 
 #include <QMainWindow>
 #include "QObjectEx.h"
 
 namespace Ui {class MainWindow;}
 
 class MainWindow : public QMainWindow
 {
    Q_OBJECT
 
 public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
 signals:
    void testSignal1(int);
    void testSignal2(int);
 
 protected:
    void showEvent(QShowEvent *) override;
 
 private:
    Ui::MainWindow *ui;
 };
 // QObjectEx.h
 
 #pragma once
 
 #include <QObject>
 
 class QObjectEx : public QObject
 {
    Q_OBJECT
 
 public slots:
    static void staticSlot(int i)
    {
       qDebug() << i;
    }
 };