2012-02-22 10 views
4

私はむしろ別々の受信スロット機能を有するより アレイの個々の要素を変更するスピンコントロールのブロックは、私はちょうど信号でメッセージを送信し、制御を指定するために思っているQtのスロット

ことができますQSignalMapperでこれを行います - しかし、とにかく以下のようにしていますか?

spin0 = new QDoubleSpinBox; 
connect(spin0,SIGNAL(valueChanged(double)),this,SLOT(handler(0,double)); 

spin1 = new QDoubleSpinBox; 
connect(spin1,SIGNAL(valueChanged(double)),this,SLOT(handler(1,double)); 
.... 

private slot: 
void handler(int element,double value); 

答えて

3

sender()を使用すると、信号を送信したオブジェクトへのポインタを取得できます。次に、objectName()プロパティを使用して、識別情報をさらに伝えることができます。

+0

しかし、受信者関数はGUIの詳細をたくさん知る必要があります。すべてのスピンコントロールオブジェクトにアクセスできる –

+0

私はあなたに従うのか分からない。ハンドラーで、各スピンコントロールのオブジェクト名を "0"、 "1"などに設定した場合は、上記の内容を達成するために 'sender() - > objectName()。toInt()'を使用できます。ハンドラは、 'QObject'がシグナルを送信した以上のことを知る必要はありません。 'sender()'は、 'handler()'が存在するオブジェクトの関数です。すべてのスピンコントロールについて知る必要はありません。 –

+0

okオブジェクト名を使用すると、それは良い解決です。私は送付者()を、あまりにも密接にハンドラーにguiを結合したspin0 ptrと比較することを考えていました! –

1

私は、少なくともその構文を使用していない、そう信じていない... SIGNALSLOTマクロはその後、解析され、ルックアップするために、関連する機能をQtのランタイムによって使用されている文字列にその引数を回しますコンパイルの前処理フェーズ中にmocによって作成されたテーブル内のクラスメソッドおよび/またはクラスメソッドを使用します。したがって、SLOTマクロにデフォルトの引数をエンコードした場合、それはmocで生成された関数テーブルの実際のスロット関数の実行時ルックアップのためにQtが使用できる有効な関数シグネチャではありません。