シグナルとスロット

シグナルスロット

備考

sender object = 送信側オブジェクト
receiver object = 受信側オブジェクト

接続する

QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection) [static]
指定された接続方法で、送出側オブジェクトのシグナルを受信側オブジェクトのスロットに接続します。

パラメータ
  • sender 送出側オブジェクトのポインタ
  • signal 送出側オブジェクトのシグナル 詳細は下記
  • receiver 受信側オブジェクトのポインタ
  • method 受信側オブジェクトのスロット 詳細は下記
  • type 接続方法

シグナルとメソッドの指定方法
シグナルは「関数名(型1, 型2, ...)」として、それを SIGNAL() マクロで囲います。
スロットも同様に「関数名(型1, 型2, ...)」として、それを SLOT() マクロで囲います。


  • シグナルの引数の数はスロットの引数の数以上でなければなりません。
スロットの引数よりシグナルの引数の方が多くても構いません。
その場合は余った引数は無視されます。
逆にスロットの引数よりシグナルの引数の方が少ないと接続に失敗します。
また引数の型は同じか異なる場合でも暗黙の型変換がなければなりません。
シグナル及びスロットの引数の数はC++11の可変テンプレート引数でない場合は最大6個に制限されます。

  • 必ず SIGNAL() マクロ及び SLOT() マクロで囲ってください。
  1. ○QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
  2. ×QObject::connect(scrollBar, valueChanged(int), label, setNum(int));
これらのマクロは与えられた引数を""で括られた文字列にするマクロです。
文字列化演算子#
  1.  
{{
qobjectdefs.h内にて
#define
SLOT(a) "1"#a
#define
SIGNAL(a) "2"#a}

  • メソッドを指定する部分は引数名を省略します
  1. ○QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
  2. ×QObject::connect(scrollBar, SIGNAL(valueChanged(int value)), label, SLOT(setNum(int value)));

サンプルコード
スクロールバーを動かすと、その値をラベルに表示する例
  1. QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));

シグナルとスロットは1対1対応でなくても構いません
  • 複数のシグナルを一つのスロットに接続できます。
  • 一つのシグナルを複数のスロットに接続できます。この場合、接続した順番にスロットが呼ばれます。
  • シグナルをシグナルに接続できます。

返り値
接続に関するハンドルを表す QMetaObject::Connection オブジェクトを返します。
これは接続を解除した後も参照できます。
このオブジェクトを調べることでシグナルとスロットの接続が上手くいったかどうかがわかります。

送信側オブジェクトAのシグナルa → 受信側オブジェクトBのスロットb

QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoConnection)

QMetaObject::Connection QObject::connect(const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method, Qt::ConnectionType type = Qt::AutoConnection) [static]
メソッドの指定は QMetaMethod オブジェクトで行います。

QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection) [static]
メンバの指定はメンバ関数ポインタで行います。

送信側オブジェクトAのシグナルa → このオブジェクトのスロットb

QMetaObject::Connection QObject::connect(const QObject * sender, const char * signal, const char * method, Qt::ConnectionType type = Qt::AutoConnection) const

送信側オブジェクトAのシグナルa → 関数オブジェクト

QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, Functor functor) [static]

QMetaObject::Connection QObject::connect(const QObject * sender, PointerToMemberFunction signal, const QObject * context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection) [static]

送信側オブジェクトAのシグナルa →×→ 受信側オブジェクトBのスロットb

bool QObject::disconnect(const QObject * sender, const char * signal, const QObject * receiver, const char * method) [static]
送出側オブジェクトのシグナルと受信側オブジェクトのスロットとの接続を解除します。
接続解除に成功した場合はtrue、そうでない場合はfalseを返します。
また接続は送信側オブジェクトまたは受信側オブジェクトのどちらかが破棄された時点で自動的に解除されます。

  • 受信側オブジェクトのすべてのシグナルとの接続を解除する
disconnect(myObject, 0, 0, 0);

  • 受信側オブジェクトのあるシグナルとの接続を解除する
disconnect(myObject, SIGNAL(mySignal()), 0, 0);

  • 受信側オブジェクトと送信側オブジェクトの接続を解除する
disconnect(myObject, 0, myReceiver, 0);

0はワイルドカードとして使用されます。
sender signal receiver method 動作
指定 指定 指定 指定 senderのsignalとreceiverのmethodとの接続を解除する
指定 指定 指定 0 senderのsignalとreceiverとのすべての接続を解除する
指定 指定 0 0 senderのsignalとのすべての接続を解除する
指定 0 指定 0 senderとreceiverとのすべての接続を解除する
指定 0 0 0 senderとのすべての接続を解除する

bool QObject::disconnect(const QObject * sender, PointerToMemberFunction signal, const QObject * receiver, PointerToMemberFunction method) [static]
メソッドの指定をメンバ関数ポインタで行います。

bool QObject::disconnect(const QObject * sender, const QMetaMethod & signal, const QObject * receiver, const QMetaMethod & method) [static]
メソッドの指定は QMetaMethod オブジェクトで行います。

bool QObject::disconnect(const QMetaObject::Connection & connection) [static]
解除する接続を QMetaObject オブジェクトで指定します。

bool QObject::disconnect(const char * signal = 0, const QObject * receiver = 0, const char * method = 0) const
このオブジェクトとの接続を解除します。
signal receiver method 動作
指定 指定 指定 senderのsignalとreceiverのmethodとの接続を解除する
指定 指定 0 senderのsignalとreceiverとのすべての接続を解除する
指定 0 0 senderのsignalとのすべての接続を解除する
0 指定 0 senderとreceiverとのすべての接続を解除する
0 0 0 senderとのすべての接続を解除する

bool QObject::disconnect(const QObject * receiver, const char * method = 0) const
このオブジェクトとの接続を解除します。
signal receiver method 動作
指定 指定 このオブジェクトとreceiverのmethodとの接続を解除する
指定 0 このオブジェクトとreceiverとのすべての接続を解除する
0 0 このオブジェクトとのすべての接続を解除する

void QObject::connectNotify(const QMetaMethod & signal) [virtual protected]
このオブジェクトのシグナルと何かを接続した場合に呼ばれます。

void QObject::disconnectNotify(const QMetaMethod & signal) [virtual protected]
このオブジェクトのシグナルと何かとの接続を解除した場合に呼ばれます。

void QObject::destroyed(QObject * obj = 0) [signal]
このシグナルはオブジェクト obj が破棄される前に送出されます。
ブロックすることはできません。

bool QObject::isSignalConnected(const QMetaMethod & signal) const [protected]
指定したシグナルが一つ以上のスロットに接続されている場合はtrue、そうでない場合はfalseを返します。
シグナルはこのオブジェクトのシグナル関数でなければなりません。

QObject * QObject::sender() const [protected]


int QObject::senderSignalIndex() const [protected]
現在実行しているスロットを呼び出したシグナルのインデックスを返します。

int QObject::receivers(const char * signal) const [protected]
指定したシグナルがいくつのスロットと接続しているかを返します。
スロットやシグナルは共にレシーバーとして使用でき、同じ接続は何回でも作成できるため、接続数を返します


bool QObject::blockSignals(bool block)
block = true の場合は、このオブジェクトによって送出されたシグナルはブロックされます。
つまり、送出したシグナルは接続されたいかなるスロットも呼び出しません。
block = false の場合は、何もブロックしません。
但し、destroyed() シグナルはこのオブジェクトのシグナルをブロックしていても送出されます。

bool QObject::signalsBlocked() const
シグナルがブロックされている場合はtrue、そうでない場合はfalseを返します。

Qt::AutoConnection|0|(デフォルト) レシーバーオブジェクトがセンダーオブジェクトと同じスレッド内にある場合は Qt::DirectConnection を使用します。そうでない場合は Qt::QueuedConnection を使用します。この判断は送出時に行われます。
Qt::DirectConnection|1|シグナルを送信すると同時に、センダーオブジェクトが存在するスレッドでスロットを実行します。
Qt::QueuedConnection|2|レシーバーオブジェクトが存在するスレッドでスロットを実行します。
Qt::BlockingQueuedConnection|3|Qt::QueuedConnectionと同じです。, except that the signalling thread blocks until the slot returns. This connection must not be used if the receiver lives in the signalling thread, or else the application will deadlock.
Qt::UniqueConnection|0x80|This is a flag that can be combined with any one of the above connection types, using a bitwise OR. When Qt::UniqueConnection is set, QObject::connect() will fail if the connection already exists (i.e. if the same signal is already connected to the same slot for the same pair of objects). This flag was introduced in Qt 4.6.

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2014年08月25日 01:56