Kデスクトップ環境

2.2. シグナルとスロット

使用方法とインプリメンテーションに若干に違いはありますが、 KOM は Qtツールキットのようなシグナルとスロットをサポートしています。 まず、最大の違いはシグナルとスロットがもはやどのようなタイプセーフでもないということです。 つまり、接続しているとき、実行時に型をチェックするようにする KOM シグナル/スロットの メタデータを作成している mocコンパイラがないということです。

もう一つの相違点は、シグナルとスロット機能を宣言する方法です。 シグナルは、シグナル引数を指定せずに SIGNAL_IMPLマクロを用いて、 komBase.hから宣言されなければなりません。スロットメソッドは CORBAインターフェースディスクリプション に定義されていなければなりません。

KOM シグナルにとって、Qt から出される "emit"キーワードと同等なのは、 SIGNAL_CALLxマクロで、 "x"は引数の数に従い、0、1、2の内の一つです。 例えば:

CORBA インターフェースディスクリプション:
   1   #include <kom.idl>
   2 
   3   interface FooSender : KOM::Base
   4   {
   5     signal void mySignal( in long foobaz );
   6   };
   7 
   8   interface FooReceiver : KOM::Base
   9   {
  10     slot void mySlot( in long gosh );
  11   };

FooSender の実装:
   1   FooSender_Impl::FooSender_Impl( ... )
   2   {
   3     ...
   4     SIGNAL_IMPL( "mySignal" );
   5     ...
   6   }
   7 
   8   FooSender_Impl::mySignal( CORBA::Long foobaz )
   9   {
  10     SIGNAL_CALL1( "mySignal", foobaz );
  11   }

FooReceiver の実装:
   1   FooReceiver_Impl::mySlot( CORBA::Long gosh )
   2   {
   3     ...
   4   }

最初に センダについていくつかあります。 インターフェースディスクリプションでシグナルを定義する必要はありません。 また単にシグナルを発信する実装を提供する必要もありません。 しかしながら多くの場合、これは推奨されていることでもあります。 というのはこれは、開発者が実装のソースの中にこのオブジェクトが発信する シグナルを見つけ出そうと努力する必要が無くなるため、開発者がインターフェースを使用する のをより簡単にしてくれるからです。 もう一つの方法は、方法を定義することなくインターフェースディスクリプションに シグナルの存在を単純に明記することです。シグナルを発信する際、技術的なポイントから SIGNAL_CALLx マクロのみカウントします。

次のものは接続と切断です。上記の例では次のようになります:
   1   ...
   2   SenderObject->connect( "mySignal", ReceiverObject, "mySlot" );
   3   ...
   4   SenderObject->disconnect( "mySignal", ReceiverObject, "mySlot");

これは全く自明のことだと思われますが、切断に際しては常にオブジェクトから切り離すことを忘れないでください。