1. ホーム
  2. c++

[解決済み] emitの使用とQtのシグナルを通常の関数として呼び出すことの比較

2022-11-15 04:03:37

質問

このような信号があるとします。

signals:
    void progressNotification(int progress);

Qtのemitキーワードを知ったのはつい最近のことです。今までは、シグナルを通常の関数と同じように呼び出すことで実行していました。だから代わりに

emit progressNotification(1000 * seconds);

私なら書きます。

progressNotification(1000 * seconds);

このように呼び出すと、接続されたすべてのスロットが実行されるようでした。emitキーワードを使用すると、異なる動作が発生するのでしょうか、それとも単なる構文上の糖分なのでしょうか?

どのように解決するのですか?

emit は単なる構文上の糖分です。シグナルを発する関数の前処理された出力を見ると、以下のようになります。 emit が消えているだけです。

マジック"はシグナルを発する関数の生成されたコードで起こりますが、これはmocによって生成されたC++コードを検査することで見ることができます。

たとえば foo シグナルでパラメータがない場合、このメンバ関数が生成されます。

void W::foo()
{
    QMetaObject::activate(this, &staticMetaObject, 0, 0);
}

そして、そのコード emit foo(); が前処理されて、単に foo();

emitQt/qobjectdefs.h (とにかくオープンソースの趣向で)こんな感じです。

#ifndef QT_NO_EMIT
# define emit
#endif

(defineガードは、名前が衝突する他のフレームワークとQtを使用するために no_keywords QMakeの設定オプションで指定します)。