2010-06-24 58 views
1

在我的代码中,我在循环内部创建了具有相同类型的新对象,并将信号连接到对象槽。这是我的审判。信号 - 循环内部的槽连接

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++; 

} 

当发生了什么事情发生信号。两个对象插槽都被调用。但我需要分开处理它们。 将信号连接到循环内的插槽是错误的吗? 如果不是我怎么能达到我的愿望?

+0

你是什么意思的“分开处理”?每个对象调用doSomething()一次。我没有理由不把信号连接到循环内的插槽,但我不明白你想要达到什么目的。 – grefab 2010-06-24 11:20:13

+0

我的意思是我想要做的事情与第一个对象不是第二个。你说:我没有理由不把信号连接到循环内的插槽。那么如何将信号连接到A类插槽? – onurozcelik 2010-06-24 11:38:28

回答

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()的行为依赖于此。

+0

好的。我用id变量做同样的事情。这个问题让我更好地理解信号插槽架构。我接受。 – onurozcelik 2010-06-24 12:57:40

+0

为更多的优雅我会建议把连接调用后,并省略条件...,只需使用aList [0] – nus 2010-06-24 16:11:00

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())); 
+0

我的目的是用第一个对象做事,而不是第二个对象。唯一可变的方法是实现这一目标吗? – onurozcelik 2010-06-24 11:41:05

+0

在这种情况下,只连接第一个。 ;-) 在环路之外(之后)拉动连接呼叫。将aList [0]传递给connect()作为第三个参数。 – nus 2010-06-24 11:57:16