信号Sを送信するクラスCがあります。Sはゼロ、1つ以上のレシーバ(R)(接続数は時間とともに変化し、connectionswは受信機によって作られる)。Qt disconnectNotify()はレシーバオブジェクトの破棄で呼び出されません
Cは、Sのリスナーの数が0より大きくなると、Sのリスナーの数が0に戻ったときに他の処理を行う必要があります。
私は、私が使用できることを考えた:
connectNotify()
と
disconnectNotify()
だけでなく、私が気づく何
はconnectNotify()関数がうまく機能していることですが、 disconnectNotify()は、受信オブジェクトが破棄されたときに(クラスC内で)呼び出されません。 disconnect()を使用した明示的な切断が使用された場合にのみ呼び出されます。
リスナーのデストラクタで明示的な切断を追加すると、アプリケーション全体を終了するときにセグメンテーション違反が発生することもありませんでした。 (すべてがダウンしているときにdisconnect()を使うのは良いことではないでしょう)
Rが破壊されたときにRインスタンスからCに送られたdestroy()シグナルを使用しようとしました。 Rが破壊時に接続されたことをどうすれば確認できますか? (受信者Rは非接続状態で存在する可能性があります):
クラスCでは、スロットX(R's destroyed()の受信時に呼び出されます)では、QObject :: receivers()をチェックすると受信者数が返されているようです破壊が行われる。破壊されているオブジェクトが接続されているかどうかわからないので、私は立ち往生しています!
アイデア?あなたは、すべてのRは、Cの前に破壊されていることを確認できた場合は
私はテストアプリで同じ動作を取得します。これは私のドキュメントと矛盾しているようです。デストラクタで明示的に切断するという考えは私にとってはうまくいくが、プログラム内の破壊の順序は物事を乱すかもしれない。信号の受信者が破壊されたときに誰かが 'disconnectNotify'を得ることができるかどうかを知りたいのです。 – tmpearce
これはQt 5で修正されています。[QTBUG-4844](https://bugreports.qt-project.org/browse/QTBUG-4844)を参照してください。 – Oktalist