【问题标题】:Slot is being called multiple times every time a signal is emitted每次发出信号时都会多次调用插槽
【发布时间】:2012-06-11 06:20:00
【问题描述】:

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

在 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 语句执行时,slot 会被调用很多次。根据我的说法,它应该只调用一次。

【问题讨论】:

  • 你确定connect没有被多次调用吗??!!!请向我们展示更多代码。 connectdisconnect写在哪个函数中??
  • emitget() 中调用了多少次?
  • 这段代码看起来不错。现在发布代码中丑陋的部分!
  • 检查QObject::disconnect(...) 是否返回true。如果是,那么这部分代码是可以的。您可能在get() 或其他地方遇到问题。
  • 我在 get() 中只使用了一个 emit 语句,那么这个槽怎么能长时间调用呢?QObject::disconnect(--) 也返回 true 。我无法理解是什么问题......我应该去 QObject::uniqueconnection()

标签: c++ qt qt4


【解决方案1】:

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

【讨论】:

  • 如果您正在发出信号,那么只有插槽被调用对吗??不管你使用了多少次 connect 语句..你能在 Qt::uniqueconnection 上描述一些东西吗..因为我是 qt 的新手,所以对它没有更多的想法..
  • 确实你调用connect的次数除非你使用Qt::UniqueConnection。如果您在函数中进行连接,并且多次调用该函数,则需要使用 Qt::UniqueConnection 否则您的插槽将被多次调用。我编辑了我的帖子,试图更好地展示这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
相关资源
最近更新 更多