Название: Управление событиями Отправлено: 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 вроде, похожая проблема решается... |