[解決済み] 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();
emit
は
Qt/qobjectdefs.h
(とにかくオープンソースの趣向で)こんな感じです。
#ifndef QT_NO_EMIT
# define emit
#endif
(defineガードは、名前が衝突する他のフレームワークとQtを使用するために
no_keywords
QMakeの設定オプションで指定します)。
関連
-
[解決済み] テスト
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー