Russian Qt Forum
Июля 07, 2025, 01:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Управление событиями  (Прочитано 12771 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Января 07, 2014, 20:11 »

Добрый день

По команде в одном из окон начинает проигрываться анимация до тех пор пока юзер не нажал любую клавишу или мышь в любом др месте (кроме внутри окна с анимацией). При этом само событие (прервавшее анимацию) должно быть проигнорировано, а перерисовка всех окон и активация/деактивация приложения должны работать. Как это сделать?

Спасибо
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Января 07, 2014, 23:08 »

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Hrundel
Гость
« Ответ #2 : Января 07, 2014, 23:41 »

А нельзя как-нибудь по типу матрешки событие в приложение передавать? По принципу указателя. Перенаправлять от одного к другому обходя нежелательные.
Записан
Bepec
Гость
« Ответ #3 : Января 07, 2014, 23:43 »

Фокус исчезает - пользователь щелкнул на что то внешнее. Профит.
Записан
Akon
Гость
« Ответ #4 : Января 08, 2014, 10:15 »

Ставить фильтр на все события (смотреть в районе QCoreApplication::notify()), в событие есть инфа о приемнике, если приемник не анимационное окно, то прерывать воспроизведение. Событие пускать дальше.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Января 08, 2014, 11:55 »

Ставить фильтр на все события (смотреть в районе QCoreApplication::notify()), в событие есть инфа о приемнике, если приемник не анимационное окно, то прерывать воспроизведение. Событие пускать дальше.

Это решение не отлавливает системные события, а только свои. Если пользователь мышкой активировал чужое окно, то программа не получит события о клике. Решение с фокусом мне кажется более приемлимое, если только это не какая-то экзотическая система с не-десктопной политикой управления фокусом окон.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Января 08, 2014, 12:30 »

Так фокус исчезает и при переключении на др приложение. Вообще с точки зрения ОС это примерно так:

- пользователь нажал в меню бар. Если не установлен обработчик класса меню (или он не реагирует на beginTrack) - приложение ничего не получит, хотя меню откроется и будет управляться мышью/клавой. Когда пункт меню выбран приложение получит событие "команда" и диспетчеризует его - при этом совсем необязательно что расклад окон изменится. Поэтому надеяться на смену фокуса не приходится
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Января 08, 2014, 14:03 »

Ставить фильтр на все события (смотреть в районе QCoreApplication::notify()), в событие есть инфа о приемнике, если приемник не анимационное окно, то прерывать воспроизведение. Событие пускать дальше.
notify не ловит команды из меню приложения (как для выбора мышью так и для hotkey)
Записан
Bepec
Гость
« Ответ #8 : Января 08, 2014, 16:36 »

Кхм... Подведём итог

Цитировать
По команде в одном из окон начинает проигрываться анимация до тех пор пока юзер не нажал любую клавишу или мышь в любом др месте (кроме внутри окна с анимацией)

Решение

Цитировать
Фокус исчезает - пользователь щелкнул на что то внешнее. Профит.

Проблема высосанная из пальца, противоречащая задаче

Цитировать
Так фокус исчезает и при переключении на др приложение.

Вопрос к Igors:

Как пользователь может переключиться на другое приложение не используя клавиши, мышь.

Записан
Akon
Гость
« Ответ #9 : Января 08, 2014, 16:53 »

Цитировать
Это решение не отлавливает системные события, а только свои. Если пользователь мышкой активировал чужое окно, то программа не получит события о клике.
Будет событие о потере фокуса.

Цитировать
notify не ловит команды из меню приложения (как для выбора мышью так и для hotkey)
Ну а до команд были же клики/кей эвенты.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Января 08, 2014, 17:27 »

Будет событие о потере фокуса.
Оно ни о чем не говорит - напр оно будет и при переключении приложения (когда нет оснований прерывать анимацию)

Ну а до команд были же клики/кей эвенты.
Нет, проверял (если надо выложу проект)

Как пользователь может переключиться на другое приложение не используя клавиши, мышь.
Напр кликнул в док (taskbar по-Вашему). Хоть мышь и "использована", никаких мышиных событий приложение не получит.

Кхм... Подведём итог
..
Проблема высосанная из пальца, противоречащая задаче
Категоричность/уверенность Ваших суждений немного не соответствует наивности предложенных Вами решений  Улыбающийся
« Последнее редактирование: Января 08, 2014, 17:29 от Igors » Записан
Bepec
Гость
« Ответ #11 : Января 08, 2014, 18:30 »

Пользователь кликнул в taskbar, фокус приложения потерян. Что ещё нужно вашему беспокойному разуму?
  Фокус окна будет потерян. И придёт сообщение в виде WM_INACTIVE и преобразуется в QEvent::ЧтотоТамOutFocus Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #12 : Января 08, 2014, 21:25 »

блин, 5 раз прочитал вопрос.... я так и не понял логику работы приложения и требования Грустный я тупой?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #13 : Января 08, 2014, 21:35 »

Аналог куба, что сейчас распространён. Когда ты на него нажал, он проигрывается. Потеря фокуса - он застыл на том моменте когда играет.

Удобно когда он встроен в страницу из нескольких. Посмотрел, щелкнул куда либо, он умолк. 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Января 09, 2014, 09:42 »

блин, 5 раз прочитал вопрос.... я так и не понял логику работы приложения и требования Грустный я тупой?
Можно плясать от термина "модальность". Анимация меняет состояние многих объектов, поэтому все обычные действия с ними должны быть запрещены, иначе обработчики рухнут. Пользователь может:
- наблюдать анимацию
- переключаться на др приложение и обратно
- закончить анимацию нажав клаву или мышь

Аналог куба, что сейчас распространён. Когда ты на него нажал, он проигрывается. Потеря фокуса - он застыл на том моменте когда играет.
Здесь анимация не "останавливается" а "заканчивается", все объекты сбрасываются в рабочее состояние и все отрисованное анимацией  исчезает.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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