我在一个块中使用一个信号和插槽连接。我的代码如下
在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()函数内部会多次调用该槽。根据我的说法,它应该只召唤一次。
答案 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(如果程序中存在循环)。