22

ブロック内で1つの信号とスロット接続を使用しています。私のコードは次のとおりです

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()));

}

このemitステートメントが実行されるときのget()関数内では、スロットが何度も呼び出されます。私によると、それは一度だけ呼び出す必要があります。

4

1 に答える 1

39

いくつかのコメントで述べられているように、これは通常、接続を1回以上呼び出すことによって発生します。スロットは、接続が確立されるたびに1回呼び出されます。たとえば、次のコードは、slot()が1回発行されると、3回呼び出されることになりsignal()ます。

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

複数回実行される可能性のあるコードで接続を行う場合は、通常Qt::UniqueConnection、5番目のパラメーターとして使用することをお勧めします。次のコードは、が1回発行slot()されると、1回呼び出されることになりsignal()ます。

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);

コードが正しく機能しない理由は、5番目のパラメーターを省略し、デフォルトをQt::DirectConnection(シングルスレッドプログラムの場合)に接続しているためだと思います。これにより、関数呼び出しであるかのようにスロットがすぐに呼び出されます。これは、切断が発生する前に接続が再度呼び出される可能性があることを意味します(プログラムにループがある場合)。

于 2012-06-12T17:48:41.190 に答える