18 か月後 ... @Mat の回答の下にコメントを書き始めたところ、すぐにスペースが足りなくなりました。したがって、答え。
IMOemit
は、次の意味で構文糖でも単純なキーワードでもありません。
- コードを生成します (上記の @Mat で説明されているように)。
connect
これは、メカニズムが実際に であることを認識するのsignal
に役立ちます。
- シグナルを「より大きな」システムの一部にし、シグナルと応答 (スロット) を同期的または非同期的に実行したり、シグナルが送信された場所と方法に応じてキューに入れたりできます。これは、シグナル/スロット システムの非常に便利な機能です。
シグナル/スロット システム全体は、単純な関数呼び出しとは異なるイディオムです。それはオブザーバーパターンに由来すると思います。signal
aと a の間にも大きな違いがありslot
ます。シグナルは実装する必要はありませんが、スロットは実装する必要があります。
あなたは通りを歩いていて、家が燃えているのを見ます (信号)。911 をダイヤルします (火災信号を 911 応答スロットに接続します)。信号は発射されただけで、スロットは消防署によって実装されました。不正確かもしれませんが、アイデアはわかります。OPの例を見てみましょう。
一部のバックエンド オブジェクトは、進行状況を認識しています。したがって、単純にemit progressNotification(...)
信号を送ることができます。このシグナルを取得して実行するのは、実際の進行状況バーを表示するクラス次第です。しかし、ビューはこの信号にどのように接続するのでしょうか? Qt のシグナル/スロット システムへようこそ。ここで、ビュー オブジェクトとデータ計算オブジェクト (両方とも ) で構成されるマネージャー クラス (通常は一種のウィジェット) を考えるQObjects
ことができますconnect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)
。
マネージャ クラスの設計面には立ち入りませんが、ここでシグナル/スロット システムが優れていると言えば十分でしょう。アプリケーションの非常にクリーンなアーキテクチャの設計に集中できます。常にではありませんが、多くの場合、シグナルを送信するだけでスロットを実装していることに気付きます。
シグナルメソッドを発行せずに使用/呼び出しが可能である場合、それは必然的に、そもそもその関数をシグナルとして必要としなかったことを意味します。