2012-03-04 4 views
1

シグナルSを送信するC(QOBJECTを継承する)というQTクラスインスタンスがあります。 私のプログラムでは、プログラム実行時に他のQTクラスインスタンスXが作成され、破棄されます。彼らは実行すなわち、これらの他のクラスは、接続してSを切断:クラスC、Sが放出されるべきかどうかの計算(およびそれに関連したデータでqt connectNotify usage

connect(C,SIGNAL(S()), this, SLOT(my_func())); // <this> is an instance of X 

または

disconnect(C,SIGNAL(S()), this, SLOT(my_func())); 

を - ここでは示されていません)はむしろ複雑なので、S(またはそれ以上)のオブジェクトが接続されている(またはリスニングされている)とき、またはすべてが切断されたときに通知されるように、クラスCのインスタンスを通知します。

私はconnectNotifydisconnectNotify機能について読んだことがあるが、その使用は推奨されません。 connectNotifyコールの数とシグナルの「リスナー」の数との間に1対1の関係がある場合(または複数のリスナーに対して1つのconnectNotifyを呼び出すことはできますか? 。

connectNotifyの数とdisconnectNotifyの数を負の数(count ++)だけ積極的に(count ++)カウントして、ゼロ以外の値に反応することはできますか?

もっと良い方法がありますか?

答えて

1

まず、connectNotifydisconnectNotifyをこの目的のために使用することができます。つまり、同じオブジェクトからの複製であっても、それぞれのconnectイベントは正しくカウントされます。

また、信号に接続されている受信機の数を返します QObject::receivers

int型はQObject ::受信機(のconstのchar *信号)のconst [保護]でこれを再確認することができます。 スロットと信号の両方を信号の受信機として使用することができ、同一の接続を何回も行うことができるので、受信機の数はこの信号からの接続数と同じである です。 この関数を呼び出すときは、SIGNAL()マクロを使用して特定の 信号を渡すことができます:if(receiver(SIGNAL(valueChanged(QByteArray))> 0){ QByteArray data; get_the_value(&データ); //高価な操作 emit valueChanged(data); //高価な操作です。 }上のコードスニペットが示すように、この関数を使用して、誰も耳を傾けないシグナルを放出することはありません。警告:この関数はオブジェクト指向の の原則に違反しています。しかし、何かが シグナルに接続されている場合にのみ、高価な初期化を実行する必要がある場合は、 が役に立ちます。

私の提案は、簡単なテストプログラムを書くことです。 connectNotifydisconnectNotifyをオーバーライドしてカウンタを増減するだけでなく、receiversを使用して、カウンタが正しいことを確認します。複数回接続するか、複数回切断するか、接続がない場合でも切断するなど

注意すべきこと:connectおよびdisconnectはスレッドセーフです。一致するNotifyの機能も安全かどうか分かりません。