每次发出信号时都会多次调用插槽

Ken*_*nta 17 c++ qt qt4

我在一个块中使用一个信号和插槽连接.我的代码如下

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

}
Run Code Online (Sandbox Code Playgroud)

当执行此emit语句时,在get()函数内部,多次调用该槽.根据我的说法,它应该只召唤一次.

Ric*_*ith 32

正如一些评论中所述,这通常是由于连接多次调用连接引起的.每次建立连接时,将调用一次插槽.例如,以下代码将在发出一次slot()时被调用3次signal().

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
Run Code Online (Sandbox Code Playgroud)

如果您在可能多次运行的代码中进行连接,则通常最好将其Qt::UniqueConnection用作第5个参数.以下代码将导致在发出一次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);
Run Code Online (Sandbox Code Playgroud)

我猜你的代码不能正常工作的原因是因为你省略了第5个参数并将默认值连接到Qt::DirectConnection(对于单线程程序).这会立即调用插槽,就好像它是一个函数调用一样.这意味着可以在断开连接之前再次调用connect(如果程序中存在循环).

  • 除非*您使用 Qt::UniqueConnection,否则您调用 connect 的次数*确实*重要。如果您在函数中进行连接,并且多次调用该函数,则需要使用 Qt::UniqueConnection 否则您的插槽将被多次调用。我编辑了我的帖子,试图更好地展示这一点。 (3认同)