2016-07-14 15 views
-1

が放出されるときにスロットが複数回呼び出されは、以下のような機能を考える:信号が

class1::class1() 
{ 
    class3 obj3 = new class3(this); 
} 
void class1::function1() 
{ 
    class2 *obj2 = new class2(); 

    connect(obj3, SIGNAL(sig()), obj2, SLOT(slt())); 

} 

void class3::function2() 
{ 
    emit sig(); 
} 

I)が(複数回関数1を呼び出しています。 function2()も複数回トリガされます

私が欲しいのは、sig()が呼び出されるたびにsig()が最初に呼び出されるときです。slt()が呼び出されているfunction1()が呼び出された回数。 次回、sig()が呼び出されると、slt()は呼び出されません。 誰かが私にこれを達成するのを助けることができれば、大きな助けになるでしょう.....

+0

[Slotは信号が送信されるたびに複数回呼び出されています](http://stackoverflow.com/questions/10975247/slot-is-being-called-multiple-times-every-time-a) -signal-is-emitting) –

答えて

2

connectに一度だけ電話する必要があります。 connectを呼び出すコードを、一度だけ呼び出される別の関数に移動します。

+0

よく@David私はそれを知っていますが、残念ながら私はこのようにしなければなりません。それは可能ですか? –

+1

@NikhilSingh - 本当に...まあ、この関数で絶対にそれを保持しなければならない場合、静的変数 'static bool connectOnFirstCall = true'を1回だけ呼び出すようにする必要があります。 connectOnFirstCallがtrueの場合はconnect()を実行し、connectOnFirstCallをfalseに設定します。接続/切断を複数回行う必要がある場合は、それを追跡するためにメンバー(グローバル)変数が必要になります。通常は正しい方法であるため、Davidの答えに+1してください。 –

+0

本当にこのようにしなければならない場合は、デザインが壊れているので、コードの再設計について考えるべきです! – Mailerdaimon

1

あなたのしていることや自分が望んでいることを理解できていません。だから私は何が起こっているのかを説明し、次にあなたが望むものを再考することができます。 Qtは期待どおりに動作しています。あなたは、信号が放射されるたびにスロットが呼び出されるようにしたいと言った。それはまさにあなたのコードがやっていることです。

ここで問題は... function1が呼び出されるたびにclass2の新しいインスタンスを作成することに気付いていますか? class2のインスタンスを1つだけ必要としていませんでしたか?それはあなたが望む方法でもっと行動するからです。

class2 *obj = 0; 
void class1::function1() 
{ 
    if(!obj) 
    { 
     obj = new class2(); 
     connect(this, SIGNAL(sig()), obj, SLOT(slt())); 
    } 
} 

void class2::function2() 
{ 
    emit sig(); 
} 

私はあなたがクラス1のオブジェクトを作成見当がつかないので、私はちょうどあなたが私たちを与えたものに基づいて何かを与えました。これはあなたが望む方法で動作するはずです。それがあなたを混乱させるなら、C++やオブジェクト指向プログラミング(OOP)を学ぶためのチュートリアルをgoogleに提案することをお勧めします。残念ながら、あなたには本/チュートリアルをお勧めできません。

私はこれがあなたを助けてくれることを願っています。

+0

私はちょうど私の質問を編集しました。 class1をmainwindow、class2をタブと見なすことができます。メインウィンドウのメニューオプションからfunction1()が呼び出され、新しいタブ(class2)が作成されます。このタブは、操作のためにテキストファイルを参照しています。この操作が終了すると、信号sig()を出して、スロットslt()のテキストファイルを閲覧したタブを閉じたいと考えています。私はそれがあなたに私がしたいことを明確にすることを願っています。どんな助けもありがとう –