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