每次发出信号时,槽函数会被多次调用。

22
我正在一个块中使用信号和槽连接。我的代码如下所示: 在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()));

}

在 get() 函数中,当执行这个 emit 语句时,槽函数会被调用多次。但我认为它应该只调用一次。


4
你确定 connect 没有被多次调用吗?请展示更多代码。在哪个函数中写了 connectdisconnect - Ammar
2
get() 函数中 emit 被调用了多少次? - cmannett85
3
这段代码看起来很不错。现在,请张贴你的代码中丑陋的部分! - ScarCode
检查 QObject::disconnect(...) 是否返回 true。如果是,则代码的这部分是正确的。您可能会在 get() 或其他地方遇到问题。 - Kuba hasn't forgotten Monica
我在get()函数中只使用了一个emit语句,为什么这个槽函数会被多次调用?QObject::disconnect(--)也返回true。我不明白问题出在哪里……我是否应该尝试使用QObject::uniqueconnection()? - Viku
1个回答

40

正如一些评论所述,这通常是由于多次调用connect引起的。每次连接都会调用一次槽。例如,当发射signal()一次时,以下代码将导致slot()被调用3次。

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

如果您在代码中进行连接可能会被多次运行,通常建议使用Qt::UniqueConnection作为第五个参数。以下代码将导致slot()在发出signal()一次时被调用1次。

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个参数,而connect默认使用Qt::DirectConnection(适用于单线程程序)。这会立即将slot调用,就像它是一个函数调用一样。这意味着在断开连接之前(如果程序中存在循环),可能会再次调用connect。


如果您发出一个信号,那么只有槽被调用了,不管您使用连接语句的次数如何。您能否描述一下Qt::uniqueconnection?因为我是Qt的新手,所以对它没有更多的了解。 - Viku
3
除非您使用Qt::UniqueConnection,否则调用connect的次数很重要。如果您在一个函数中进行连接,并且多次调用该函数,则需要使用Qt::UniqueConnection,否则您的槽将被调用多次。我编辑了我的帖子,以便更好地说明这一点。 - Rick Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接