2012-06-11 14 views
14

ブロック内で1つの信号とスロットの接続を使用しています。このEMIT文が実行されたときのget()関数の内部a.cpp信号が送信されるたびにスロットが複数回呼び出されています

{ 
QObject::connect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
       this,SLOT(GetFlang1DimAftrAnalysis())); 

m_ptheFlange2Details->get();// one function inside which i am emiting 
          // GetFlang1DimAfterAnalysis() signal ; 

QObject::disconnect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), 
        this,SLOT(GetFlang1DimAftrAnalysis())); 

} 

を次のように私のコードでは、スロットは時間がたくさん呼ばれています。私によれば、それは一度だけ呼び出すべきです。

+4

'connect'が複数回呼び出されていないことを確認しましたか?もう少しコードを表示してください。 'connect'と' disconnect'関数が書かれていますか? – Ammar

+2

'emit'は' get() 'で何回呼び出されますか? – cmannett85

+2

このコードはよく見えます。コードの醜い部分を投稿してください! – ScarCode

答えて

26

コメントのいくつかで述べたように、これは通常、接続を一度呼び出すことによって発生します。スロットは、接続が確立されるたびに1回呼び出されます。たとえば、signal()が1回発行されると、次のコードではslot()が3回呼び出されます。あなたが複数回実行することができるコードでコネクトを行っている場合

connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot())); 

は、一般的に5番目のパラメータとしてQt::UniqueConnectionを使用することをお勧めします。次のコードでは、signal()が1回発行されたときにslot()が1回呼び出されます。あなたは第五パラメータを省略し、(シングルスレッドプログラム用)Qt::DirectConnectionにデフォルトを接続しているので、私はあなたのコードが正しく動作していない理由を推測している

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection); 

です。これは、直ちに関数呼び出しであるかのようにスロットを呼び出します。つまり、切断が発生する前に(プログラムにループがある場合)、connectを再度呼び出すことが可能です。

+0

信号を放射している場合は、スロットだけが正しく呼び出されていますか?接続文を何回使用したかは関係ありません。Qt :: uniqueconnectionに何かを記述してもらえますか?私はqtを初めて使うので、それ以上のアイデアはありません。 – Kenta

+1

Qt :: UniqueConnectionを使用しない限り、何度もあなたはconnect *を呼び出します。関数内で接続を行い、その関数を複数回呼び出す場合は、Qt :: UniqueConnectionを使用する必要があります。そうしないと、スロットが複数回呼び出されます。私はポストを少し改良してみるよう編集しました。 –

+0

@ Rick - Thankxxx – Kenta

関連する問題