Сигнал - Слот соединения внутри петли - PullRequest
1 голос
/ 24 июня 2010

В моем коде я создаю новые объекты того же типа внутри цикла и подключаю сигнал к слоту объекта. Вот мое испытание.

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 ]

3 голосов
/ 24 июня 2010

Если я вас правильно понимаю, вы можете захотеть сделать что-то подобное?

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 () зависимым.

2 голосов
/ 24 июня 2010

Насколько я понимаю ваш вопрос, вы хотите знать, вызывается ли doSomething () для первого или второго объекта. Вероятно, я бы первым делом дал классу 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() ) );
...