<< QT && C++ トップ

独自のSIGNALを送る方法

なにかイベントが起こった時にそれを感知するのに次のようにconnect関数が使われます。例えば次のようなコードです。

QPushButton* button = new QPushButton(this);
connect(button, SIGNAL(pressed()), this, SLOT(close()));

SIGNAL内の関数が呼び出されたことがconnect関数に伝わるとSLOTに渡した関数が実行されるようになります。

このSIGNALに渡す関数を自作したい場合、SIGNAL関数を作り、それを任意の場所でemitを使って送信します。

シグナル関数を作るとは具体的には次のようなコードです。

#ifndef MY_CLASS_H
#define MY_CLASS_H
#include <QObject>

class MyClass : public QObject
{
    Q_OBJECT

public:
    explicit MyClass(){}
    ~MyClass(){}

signals:
    mySignal(int num);
        //送信するシグナル

public slots:
    /*シグナルを送信する関数*/
    void emitMySignal(int num)
    {
        emit mySignal(num);
            //mySignal関数を送信する
    }

public:
    void setNum(int num)
    {
        this.num = num;
        emitMySignal(num);
    }

private:
    int num;
};

#endif //MY_CLASS_H

signalラベルの後に宣言した関数はすべてシグナル関数として定義されます。

上のクラスではメンバ関数のnumが変更されたらemitを使って値が変更されたことを知ることができるようにしています。

このクラスに対してconnect関数は次のように書けます。

MyClass * myClass = new MyClass();
connect(myClass, SIGNAL(mySignal(int)), this, SLOT(changeNum(int)));

mySignalから変更後の値を引数としてスロットの関数に渡すことができるようになります。

これがシグナル関数の基本的な作り方です。

関連項目
プライバシーポリシー