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

+0

Я имею в виду то, что я хочу сделать с первым объектом, а не вторым. Вы говорите: я не вижу причин не подключать сигнал к слоту внутри цикла. Как подключить сигнал к слоту класса А? – onurozcelik

ответ

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

Это подключает сигнал только к первому объекту (но это совершенно очевидно). Невозможно подключить сигнал к нескольким слотам, но отправить его только одному.

Если это действительно ваше намерение, было бы более элегантно, если бы вы действительно подключили этот за пределами цикла.

Еще одна возможность - соединить все, что вы делали раньше, но сохраните какую-либо переменную-член ob в каждом экземпляре A и создайте поведение doSomething(), зависящее от этого.

+0

Хорошо. Я делаю то же самое с переменной id. Этот вопрос заставляет меня лучше понимать архитектуру сигнального слота. Я принимаю это. – onurozcelik

+0

для большей элегантности Я бы предложил поставить вызов соединения через некоторое время, и опустить условие ..., просто используйте aList [0] – nus

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

Моя цель - сделать что-то с первым объектом A, а не вторым. Уникальная переменная - единственный способ добиться этого? – onurozcelik

+0

В этом случае подключите только первый. ;-) Потяните вызов соединения снаружи (после) цикла. Передайте aList [0] для подключения() в качестве третьего параметра. – nus