22

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

在一个.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

正如一些评论中所述,这通常是由于多次调用连接造成的。每次建立连接时,都会调用一次插槽。例如,以下代码在发出一次slot()时将导致被调用 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 个参数通常是一个好主意。以下代码将导致在发出一次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(对于单线程程序)。这会立即调用插槽,就好像它是一个函数调用一样。这意味着有可能在断开连接之前再次调用 connect(如果您的程序中有循环)。

于 2012-06-12T17:48:41.190 回答