2012-03-25 11 views
12

信号をスロットに接続するには、わかっている限り、信号のパラメータがスロットのパラメータと一致する必要があります。ですから、例えば:信号を一定値のスロットに接続する

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(closeDockWidget())); 

しかし、私は、信号の呼び出しパラメータの異なる量を持っているスロットを持っていますが、常にスロットに一定の値を渡したい場合はどのような。例えば、コードの上記部分の使用:ボタンが押されるたびに

connect(dockWidget->titleBarWidget(), SIGNAL(closeButtonClicked()), ui->sideControls, SLOT(setDockWidget(false))); 

または他の言葉では、それは偽のパラメータでsetDockWidget()関数を呼び出します。これは可能ですか?

答えて

8

いいえ、できません。対応するシグナルよりも、引数の数が少ないか等しいスロットだけを接続することができます。 (documentationを参照)

プロキシスロットを作成する必要があります。

+1

この答えはもはや実際には有効ではありません。なぜなら、C++ 11のQt5構文はこの目的のためにラムダを使うのがとても簡単だからです。 –

+1

@André、反対側では、あなたはちょうど 'プロキシスロットを作って、それは望んでいるものを呼び出すことができます '。今度は – Lol4t0

+1

できます。しかし余分なスロットとは、外部の呼び出し(たとえプライベートなスロットが外部から呼び出せても)にさらされ、複数の場所に渡ってコードの周りに広がることを望まない、あなたのヘッダーにもっとたくさんのものを意味します。渡す値を格納するために追加のメンバ変数が必要な場合もあります。したがって、クラスに状態を追加します。ラムダソリューションは非常に洗練されているため、ソリューションIMOとしてのプロキシスロットの導入が不適格となります。 –

6

ところで、はい、できます。しかし、それは非常に強力ではありません。ただsetDockWidgetこのように宣言:

[virtual] void setDockWidget(bool state=false) ; 

をし、接続をこのように宣言します。引数なしで呼び出さ

connect(emitter, SIGNAL(closeButtonClicked()), receiver, SLOT(setDockWidget())); 

setDockWidgetは、デフォルトのものを取ります。

8

と希望電話定数の引数を使用することができます。例:

connect(obj, &ObjType::signalName, [this]() { desiredCall(constantArgument); }); 

新しい接続構文の詳細:https://wiki.qt.io/New_Signal_Slot_Syntax

+0

あなたのケースでは、定数引数と変数を組み合わせることは可能ですか? –

+0

@AlekseyKontsevich:あなたを正しく理解していれば、信号をスロットに渡すこともできますか?できますよ。ラムダの引数にして、その引数を関数の呼び出しで使用します。しかし、コンテキスト引数に 'this'という値を使用することをお勧めします。このようにして、受信オブジェクトが破棄された場合に接続が破棄されることを確認できます。さもなければ、あなたは未定義の振る舞いに終わるかもしれません。 –