Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Января 07, 2014, 20:11



Название: Управление событиями
Отправлено: Igors от Января 07, 2014, 20:11
Добрый день

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

Спасибо


Название: Re: Управление событиями
Отправлено: Racheengel от Января 07, 2014, 23:08
а почему событие должно прерывать анимацию? как одно с другим связано?


Название: Re: Управление событиями
Отправлено: Hrundel от Января 07, 2014, 23:41
А нельзя как-нибудь по типу матрешки событие в приложение передавать? По принципу указателя. Перенаправлять от одного к другому обходя нежелательные.


Название: Re: Управление событиями
Отправлено: Bepec от Января 07, 2014, 23:43
Фокус исчезает - пользователь щелкнул на что то внешнее. Профит.


Название: Re: Управление событиями
Отправлено: Akon от Января 08, 2014, 10:15
Ставить фильтр на все события (смотреть в районе QCoreApplication::notify()), в событие есть инфа о приемнике, если приемник не анимационное окно, то прерывать воспроизведение. Событие пускать дальше.


Название: Re: Управление событиями
Отправлено: Alex Custov от Января 08, 2014, 11:55
Ставить фильтр на все события (смотреть в районе QCoreApplication::notify()), в событие есть инфа о приемнике, если приемник не анимационное окно, то прерывать воспроизведение. Событие пускать дальше.

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


Название: Re: Управление событиями
Отправлено: Igors от Января 08, 2014, 12:30
Так фокус исчезает и при переключении на др приложение. Вообще с точки зрения ОС это примерно так:

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


Название: Re: Управление событиями
Отправлено: Igors от Января 08, 2014, 14:03
Ставить фильтр на все события (смотреть в районе QCoreApplication::notify()), в событие есть инфа о приемнике, если приемник не анимационное окно, то прерывать воспроизведение. Событие пускать дальше.
notify не ловит команды из меню приложения (как для выбора мышью так и для hotkey)


Название: Re: Управление событиями
Отправлено: Bepec от Января 08, 2014, 16:36
Кхм... Подведём итог

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

Решение

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

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

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

Вопрос к Igors:

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



Название: Re: Управление событиями
Отправлено: Akon от Января 08, 2014, 16:53
Цитировать
Это решение не отлавливает системные события, а только свои. Если пользователь мышкой активировал чужое окно, то программа не получит события о клике.
Будет событие о потере фокуса.

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


Название: Re: Управление событиями
Отправлено: Igors от Января 08, 2014, 17:27
Будет событие о потере фокуса.
Оно ни о чем не говорит - напр оно будет и при переключении приложения (когда нет оснований прерывать анимацию)

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

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

Кхм... Подведём итог
..
Проблема высосанная из пальца, противоречащая задаче
Категоричность/уверенность Ваших суждений немного не соответствует наивности предложенных Вами решений  :)


Название: Re: Управление событиями
Отправлено: Bepec от Января 08, 2014, 18:30
Пользователь кликнул в taskbar, фокус приложения потерян. Что ещё нужно вашему беспокойному разуму?
  Фокус окна будет потерян. И придёт сообщение в виде WM_INACTIVE и преобразуется в QEvent::ЧтотоТамOutFocus :)


Название: Re: Управление событиями
Отправлено: Racheengel от Января 08, 2014, 21:25
блин, 5 раз прочитал вопрос.... я так и не понял логику работы приложения и требования :( я тупой?


Название: Re: Управление событиями
Отправлено: Bepec от Января 08, 2014, 21:35
Аналог куба, что сейчас распространён. Когда ты на него нажал, он проигрывается. Потеря фокуса - он застыл на том моменте когда играет.

Удобно когда он встроен в страницу из нескольких. Посмотрел, щелкнул куда либо, он умолк. 


Название: Re: Управление событиями
Отправлено: Igors от Января 09, 2014, 09:42
блин, 5 раз прочитал вопрос.... я так и не понял логику работы приложения и требования :( я тупой?
Можно плясать от термина "модальность". Анимация меняет состояние многих объектов, поэтому все обычные действия с ними должны быть запрещены, иначе обработчики рухнут. Пользователь может:
- наблюдать анимацию
- переключаться на др приложение и обратно
- закончить анимацию нажав клаву или мышь

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


Название: Re: Управление событиями
Отправлено: Bepec от Января 09, 2014, 10:08
Вы на вопрос ответьте пожалуйста
Пользователь кликнул в taskbar, фокус приложения потерян. Что ещё нужно вашему беспокойному разуму?
  Фокус окна будет потерян. И придёт сообщение в виде WM_INACTIVE и преобразуется в QEvent::ЧтотоТамOutFocus :)


Название: Re: Управление событиями
Отправлено: Igors от Января 09, 2014, 10:42
Вы на вопрос ответьте пожалуйста
Пользователь кликнул в taskbar, фокус приложения потерян. Что ещё нужно вашему беспокойному разуму?
  Фокус окна будет потерян. И придёт сообщение в виде WM_INACTIVE и преобразуется в QEvent::ЧтотоТамOutFocus :)
Не вижу почему мне это "нужно". Ну поменялся фокус и что с того? Мое приложение не получало действия пользователя прерывающего анимацию. А что там произошло за пределами приложения - не волнует. В исходном посте ясно сказано - переключение задач должно работать.


Название: Re: Управление событиями
Отправлено: Racheengel от Января 09, 2014, 11:40
Аналог куба, что сейчас распространён.

Вот блин... Я не знаю даже, что такое этот "куб" :( Никогда не видел такого...

А по сути: это окна одного и того же приложения? или имеется в виду, что окно играет что-то, но если мы переходим на другое приложение, видео должно остановиться?
Но в любом случае, это значит, что сообщения типа focusInEvent/focusOutEvent должны быть перехвачены и обработаны. Почему при этом должно меняться состояние еще каких-нибудь объектов?


Название: Re: Управление событиями
Отправлено: Racheengel от Января 09, 2014, 11:44
Не вижу почему мне это "нужно". Ну поменялся фокус и что с того? Мое приложение не получало действия пользователя прерывающего анимацию. А что там произошло за пределами приложения - не волнует. В исходном посте ясно сказано - переключение задач должно работать.

Сообщение придет от винды, как признак того, что сменилось активное приложение. На переключение задач это не будет влиять, т.к. данное сообщение - это постфактум. Просто система сообщает, что такое-то окно потеряло фокус, и все.


Название: Re: Управление событиями
Отправлено: Bepec от Января 09, 2014, 12:15
Igors, вы .... притворяетесь сами-знаете-кем? (воображение вам подскажет нужное слово :) )

Вам решили задачу.

PS больше писать не буду в этой теме. Как об стену горох.

to Racheengel http://www.yaplakal.com/forum3/topic621599.html?hl=coub


Название: Re: Управление событиями
Отправлено: Igors от Января 09, 2014, 12:17
А по сути: это окна одного и того же приложения? или имеется в виду, что окно играет что-то, но если мы переходим на другое приложение, видео должно остановиться?
Нет, не должно, о чем уже говорилось неоднократно, начиная с исходного поста.

Но в любом случае, это значит, что сообщения типа focusInEvent/focusOutEvent должны быть перехвачены и обработаны. Почему при этом должно меняться состояние еще каких-нибудь объектов?
"Анимация" необязательно "видео", здесь это последовательность кадров создаваемая/рисуемая самим приложением. Что Вы "ищете под фонарем потому что там светло?" :) Фокус никакого отношения к задаче не имеет

PS больше писать не буду в этой теме.
Огромное Вам СПАСИБО



Название: Re: Управление событиями
Отправлено: Racheengel от Января 09, 2014, 16:21
Ок. Что должно произойти, если пользователь нажал одно из следующего:

1. Alt+Tab
2. Win
3. Ctrl+Alt+Del
4. Win+R
5. Win+L

?


Название: Re: Управление событиями
Отправлено: Racheengel от Января 09, 2014, 16:58
to Racheengel http://www.yaplakal.com/forum3/topic621599.html?hl=coub

ммм... а что в нем такого особенного? ютуб как ютуб :) у меня после старта анимации она просто крутится в цикле и все.


Название: Re: Управление событиями
Отправлено: Igors от Января 09, 2014, 17:29
Ок. Что должно произойти, если пользователь нажал одно из следующего:
Исходите из простого понятия "модальность". Напр если идут длинные расчеты и прогресс отображается в модальном QProgressDialog - в этом случае Вы же не спрашиваете "что должно произойти?". То же самое и здесь


Название: Re: Управление событиями
Отправлено: Racheengel от Января 09, 2014, 18:48
ммм, вроде идею я понял... ну а может сделать так:
- в момент старта анимации делаем это окно модальным
- и дизейблим на нем все остальные виджеты, кроме кнопки "стоп", ну или что еще у вас там для этого.
- анимация остановилась - все возвращаем взад.


Название: Re: Управление событиями
Отправлено: Igors от Января 09, 2014, 19:27
ммм, вроде идею я понял... ну а может сделать так:
- в момент старта анимации делаем это окно модальным
- и дизейблим на нем все остальные виджеты, кроме кнопки "стоп", ну или что еще у вас там для этого.
- анимация остановилась - все возвращаем взад.
Тут со всех сторон так называемые "костыли". Перед установкой setWindowModality нужно сначала скрыть окно (hide). Также оно почему-то добавляет системный фрейм (хотя окно с флагом Frameless..). Кнопка "стоп" не предусмотрена и куда там ее лепить - хз, причем окон далеко не одно. Ну и модальность не запрещает меню/hotkeys, которое придется мучительно дизаблить.

Идеально подходит processEvents(ExcludeUserEvents) - но тогда чем остановить анимацию?  :)


Название: Re: Управление событиями
Отправлено: Racheengel от Января 09, 2014, 23:21
не знаю конечно, но может это поможет?

http://qt-project.org/forums/viewthread/3055

вроде, похожая проблема решается...