信号 - 循环内部的插槽连接

时间:2010-06-24 11:10:59

标签: c++ qt qt4 signals signals-slots

在我的代码中,我在循环内创建相同类型的新对象,并将信号连接到对象槽。这是我的试用。

A * a;
QList<A *> aList;
int aCounter = 0;
while(aCounter < 2)
{
   a = new A;
   aList.push_back(a);
   connect(this,SIGNAL(somethingHappened()),aList[aCounter],SLOT(doSometing()));
   aCounter++;

}

当发生某事时发出信号。调用两个对象槽。但我需要单独处理它们。 将信号连接到环路内的插槽是不对的? 如果不是,我怎样才能达到我的愿望?

2 个答案:

答案 0 :(得分:3)

如果我理解正确你可能想做这样的事情吗?

A * a;
QList<A *> aList;
int aCounter = 0;
while(aCounter < 2)
{
   a = new A;
   aList.push_back(a);

   if ( aCounter == 0 )
      connect(this,SIGNAL(somethingHappened()),aList[aCounter],SLOT(doSometing()));

   aCounter++;
}

这只将信号连接到第一个对象(但这很明显)。无法将信号连接到多个插槽,只能将其发送到一个插槽。

如果这是你的意图,那么如果你真的把它连接到循环之外会更优雅。

另一种可能性是像以前一样连接所有内容,但在A的每个实例中存储一些ob成员变量,并使doSomething()的行为依赖于此。

答案 1 :(得分:2)

据我了解你的问题,你想知道是否在第一个或第二个对象上调用了doSomething()。我可能会这样做的方法是首先给A类一个布尔成员并将其设置在循环中。这样对象知道它的位置。如果你有更多的物品,你可以给他们一个柜台。为了跟踪,在A类上有一个静态计数器变量。所有这些都取决于你真正想要实现的目标。

以循环方式连接信号非常完美。

A * a;
QList<A *> aList;
int aCounter = 0;

while( aCounter < 2 )
{
   aList.push_back( new A );
   ++aCounter;
}

connect( this, SIGNAL( somethingHappened() ), aList[0], SLOT( doSometing() ) );