Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: danya7sh от Июнь 07, 2016, 20:31



Название: сигналы и слоты, цикл событий, очередь событий
Отправлено: danya7sh от Июнь 07, 2016, 20:31
Здравствуйте, подскажите пожалуйста, как в СЕРЕДИНЕ слота можно разрешить закончить работу, приостановленную из-за вызова этого слота?
Получается, если разбить на ДВА слота, присоединяя один из, используя тип Qt::QueuedConnection, но такой вариант не устраивает.


Название: Re: сигналы и слоты, цикл событий, очередь событий
Отправлено: Bepec от Июнь 07, 2016, 21:14
Никак. А в чем смысл столь странной и непонятной задачи?


Название: Re: сигналы и слоты, цикл событий, очередь событий
Отправлено: _OLEGator_ от Июнь 07, 2016, 21:18
Что значит разрешить закончить работу?
В слоте вызвать другой слот асинхронно и return после.


Название: Re: сигналы и слоты, цикл событий, очередь событий
Отправлено: danya7sh от Июнь 07, 2016, 21:29
смысл в том, чтобы не использовать два слота
при нажатии на кнопку запускаю цикл, в цикле запускаю функцию, которая анимирует элементы
но при нажатии другой кнопки нужно сначала закончить анимацию текущей итерации цикла и выйти из цикла, а потом уже делать то, для чего вызван слот


Название: Re: сигналы и слоты, цикл событий, очередь событий
Отправлено: danya7sh от Июнь 07, 2016, 21:34
как вызвать асинхронно?


Название: Re: сигналы и слоты, цикл событий, очередь событий
Отправлено: Hellraiser от Июнь 08, 2016, 07:59
Не вызывай слот напрямую, а используй QMetaObject::invokeMethod (http://doc.qt.io/qt-5/qmetaobject.html#invokeMethod) с параметром Qt::QueuedConnection


Название: Re: сигналы и слоты, цикл событий, очередь событий
Отправлено: Igors от Июнь 08, 2016, 08:07
смысл в том, чтобы не использовать два слота
при нажатии на кнопку запускаю цикл, в цикле запускаю функцию, которая анимирует элементы
но при нажатии другой кнопки нужно сначала закончить анимацию текущей итерации цикла и выйти из цикла, а потом уже делать то, для чего вызван слот
Если все в главном потоке, то нужен вторичный цикл событий, напр
Код
C++ (Qt)
QPointer<QObject> theAnimObj = 0;  // объект что сейчас крутит анимацию
 
void SomeObject::SlotAnimate1( void )
{
// если др анимация сейчас активна - даем ей выйти
 if (theAnimObj && (theAnimObj != this)) {
   theAnimObj = 0;
   emit SignalAnimate1();   // этот сигнал должен быть с QueuedConnection
   return;
}
 
// устанавливаем theAnimObj на себя
 theAnimObj = this;
 
// на каждой итерации проверяем отмену
 for (int i = 0; i < numFrames; ++i) {
   qApp->processEvents();
   if (theAnimObject != this) break;
   ...
  // показываем кадр анимации
 }
 
// обнуляем theAnimObj
 theAnimObj = 0;
}


Название: Re: сигналы и слоты, цикл событий, очередь событий
Отправлено: Bepec от Июнь 08, 2016, 12:46
Прокручивать цикл и в конце каждой итерации вызывать processEvents. Тогда, по идее, слот вызванный позднее анимации совершит свою работу, а цикл анимации после этого продолжится. Но тут уже пробовать надо :)