Russian Qt Forum
Сентябрь 21, 2024, 17:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигналы и слоты, цикл событий, очередь событий  (Прочитано 4543 раз)
danya7sh
Гость
« : Июнь 07, 2016, 20:31 »

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

Никак. А в чем смысл столь странной и непонятной задачи?
Записан
_OLEGator_
Гость
« Ответ #2 : Июнь 07, 2016, 21:18 »

Что значит разрешить закончить работу?
В слоте вызвать другой слот асинхронно и return после.
Записан
danya7sh
Гость
« Ответ #3 : Июнь 07, 2016, 21:29 »

смысл в том, чтобы не использовать два слота
при нажатии на кнопку запускаю цикл, в цикле запускаю функцию, которая анимирует элементы
но при нажатии другой кнопки нужно сначала закончить анимацию текущей итерации цикла и выйти из цикла, а потом уже делать то, для чего вызван слот
« Последнее редактирование: Июнь 07, 2016, 21:37 от danya7sh » Записан
danya7sh
Гость
« Ответ #4 : Июнь 07, 2016, 21:34 »

как вызвать асинхронно?
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #5 : Июнь 08, 2016, 07:59 »

Не вызывай слот напрямую, а используй QMetaObject::invokeMethod с параметром Qt::QueuedConnection
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 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;
}
« Последнее редактирование: Июнь 08, 2016, 08:50 от Igors » Записан
Bepec
Гость
« Ответ #7 : Июнь 08, 2016, 12:46 »

Прокручивать цикл и в конце каждой итерации вызывать processEvents. Тогда, по идее, слот вызванный позднее анимации совершит свою работу, а цикл анимации после этого продолжится. Но тут уже пробовать надо Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 22.