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

时间:2012-06-11 06:20:01

标签: 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()));

}

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

1 个答案:

答案 0 :(得分:31)

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

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

如果您在可能多次运行的代码中进行连接,则通常最好使用Qt::UniqueConnection作为第5个参数。以下代码将导致slot()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(对于单线程程序)。这会立即调用插槽,就好像它是一个函数调用一样。这意味着可以在断开连接之前再次调用connect(如果程序中存在循环)。