2012-02-03 3 views
2
void SomeClass::mySlot(MyClass *var){ 
    ... 
} 

void SomeClass::SomeFunction(){ 
    MyClass *myVar; 
    QPushButton *button = new QPushButton(this); 
    connect(button, SIGNAL(clicked()), this, SLOT(mySlot(myVar))); 
} 

ボタンをクリックしたときにmyVarを受け取るようにします。 そのようなことは可能でしょうか?私はSomeClassにmyVarポインタを格納したくありません。Qt。接続SLOT()でローカル変数を使用することは可能ですか?

更新(私の解決策):

void SomeClass::mySlot(){ 
    QPushButton *button = static_cast<QPushButton*>(sender()); 
    MyClass *myVar = qobject_cast<MyClass*>(qvariant_cast<QObject *>(button->property("myVar"))); 
    ... 
} 

void SomeClass::SomeFunction(){ 
    MyClass *myVar; 
    QPushButton *button = new QPushButton(this); 
    button->setProperty("myVar", QVariant::fromValue((QObject*)myVar)); 
    connect(button, SIGNAL(clicked()), this, SLOT(mySlot())); 
} 
+1

あなたのソリューションはおそらく動作しません。 'connect'呼び出しは失敗します。 – TonyK

+0

コピー貼り付けの間違いでした。私は 'connect'を修正しました。ご意見ありがとうございます! – Eddie

答えて

3

ありません、それは不可能です。あなたはいくつかのパラメータを捨てるスロットを使うことができますが、信号より多くのパラメータを持つスロットは使用できません。さらに、スロットを接続するときに変数を渡すことはできません。

+0

あなたの答えに感謝します! – Eddie

+0

効果的にconnect関数は関数呼び出しのシグネチャと一致しています。 –

+1

この回答は実際には正しくありません。 @Eddieが望むことをすることは可能です - いくつかの制限がありますが、それは不可能ではありません。 – Mat

2

QSignalMapper(ここでの使用例を参照)でいくつかの制限がありますが、オブジェクトの寿命には非常に注意する必要があります。

QSignalMapper *signalMapper = new QSignalMapper(this); 
MyClass *myVar = new ...; 

QPushButton *button = new QPushButton(this); 
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 
signalMapper->setMapping(button, myVar); 

connect(signalMapper, SIGNAL(mapped(MyClass*)), 
     this, SIGNAL(MySlot(MyClass*))); 

QObjectまたはQWidget由来するMyClassニーズに注意してください。)

これがある限り、オブジェクトがmyVarによって指されるように動作します有効なままである(つまりは削除されません)が、あなたドン場合そのオブジェクトへのポインタをどこかに格納しておけば、簡単に削除することはできません。そのため、メモリリークが発生する可能性があります。 (。あなたは信号マッパとボタンのポインタを保持する場合は、QSignalMappermappingメンバーと、そのオブジェクトを復元することができます)

一方、次を動作しません。

QSignalMapper *signalMapper = new QSignalMapper(this); 
MyClass myVar; 
... 
signalMapper->setMapping(button, &myVar); // WRONG 
... 

この場合、someFunctionが終了すると、myVarによって参照されるオブジェクトが破壊されるため、スロットに無効なポインタが送られ、未定義の動作が発生します(つまり、バグ、クラッシュ、他、...)。

+2

良い解決策。私は以下を使用することに決めました: button-> setProperty( "myVar"、QVariant :: fromValue((QObject *)myVar)); (接続前) MyClass * myVar = qobject_cast (static_cast (sender())>プロパティ( "myVar"))); (スロット内) – Eddie

関連する問題