2010-06-24 119 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