Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Октябрь 26, 2015, 08:09



Название: Закрыть окно без смены фокуса
Отправлено: Igors от Октябрь 26, 2015, 08:09
Добрый день

Все окна frameless (по многим соображениям) title рисуется самостоятельно и имеет свою бубочку "закрыть". И все хорошо, но есть мелкая неприятность: когда юзер тычет в "закрыть", окно сначала получает фокус, отрисовывается (перекрывая др окна), и только потом закрывается, фокус возвращается на предыдущее окно. Как побороть этот неприятный эффект мигания?

Спасибо 


Название: Re: Закрыть окно без смены фокуса
Отправлено: Old от Октябрь 26, 2015, 08:50
А у кнопки закрыть какой focus policy?
Попробуйте установить ей Qt::NoFocus.


Название: Re: Закрыть окно без смены фокуса
Отправлено: Vladimir от Ноябрь 01, 2015, 19:51
а не подскажите как вы нарисовали свой title c бубочкой "закрыть"?) что переопределить надо или настроить.. а то у меня проект есть под linux с openbox и там никаким образом не хотят убираться кнопки максимизации и минимизации окна! под win флаги работают, а там 0 реакции. так может это вариант нарисовать свой title c одной кнопкой закрыть.. но возможность перемещать окна должна остаться!


Название: Re: Закрыть окно без смены фокуса
Отправлено: Racheengel от Ноябрь 01, 2015, 21:41
В линуксе все решает оконный менеджер.

А воообще технология такая, прячем заголовок пплностью и сами ставим какие хотим кнопки. Но тока если менеджер не против ;)


Название: Re: Закрыть окно без смены фокуса
Отправлено: Bepec от Ноябрь 02, 2015, 07:57
Да, интересная задачка, но без переключения на окно по идее не получится. Возможно сделать возврат на текущее фокусное окно, после закрытия.
А чтобы прям вообще без фокуса - нужно либо вести плотный контроль мыши+окна, либо ковырять оконный менеджер :)


Название: Re: Закрыть окно без смены фокуса
Отправлено: Igors от Ноябрь 02, 2015, 09:53
а не подскажите как вы нарисовали свой title c бубочкой "закрыть"?)
А воообще технология такая, прячем заголовок пплностью и сами ставим какие хотим кнопки. Но тока если менеджер не против ;)
Товарищи дорогие, ну когда ж научимся тему-то читать? Я уж не прошу "внимательно", просто прочитать. Ну ведь сказано же ("во первых словах моего поста")
Все окна frameless
Что значит Qt::FramelessWindowHint. Т.е. все окно - площадь клиента. Наоборот, при наличии сыстемного титла этой проблемы не возникает - но он меня не устраивает.

Да, интересная задачка, но без переключения на окно по идее не получится.
Если гадаете - так угадывайте, а то вечно "пальцем в небо". Перехват есть через installNativeEventFilter, но это так хлопотно  :'(


Название: Re: Закрыть окно без смены фокуса
Отправлено: Bepec от Ноябрь 02, 2015, 11:48
Уот так не свистите :D
В любом случае вы ПРИНИМАЕТЕ сообщение и после уже реакция. А тут такая неловкая ситуация, что менеджер оконный вашему окну фокус отдаст :) И вы ничем ему не помешаете. Вы можете хоть вообще прикинуться мертвым окошком без реакций на события, но фокус на нём будет ^_^

PS не путайте ФИЛЬТР СОБЫТИЙ ДЛЯ ПРИЛОЖЕНИЯ и перехват события оконного менеджера. :)


Название: Re: Закрыть окно без смены фокуса
Отправлено: Igors от Ноябрь 02, 2015, 12:09
Уот так не свистите :D
Насчет "свиста" Вам бы (главному свистуну здесь) лучше помолчать в тряпочку  :)

В любом случае вы ПРИНИМАЕТЕ сообщение и после уже реакция. А тут такая неловкая ситуация, что менеджер оконный вашему окну фокус отдаст :) И вы ничем ему не помешаете. Вы можете хоть вообще прикинуться мертвым окошком без реакций на события, но фокус на нём будет ^_^

PS не путайте ФИЛЬТР СОБЫТИЙ ДЛЯ ПРИЛОЖЕНИЯ и перехват события оконного менеджера. :)
Шо Вы тут рисуете большими буквами? Ваш метод что-то услышать и повторить своими словами. Ну так следуйте ему, я Вам уже сообщил что системное событие нажатие мыши приходит ДО смены фокуса окна, чего Вы носитесь с "оконным менеджером" как курица с яйцом?

И вообще - сколько раз Вы клялись не лезть в мои темы? Так нет же, опять "творческий зуд"  :'(


Название: Re: Закрыть окно без смены фокуса
Отправлено: GreatSnake от Ноябрь 02, 2015, 12:32
Дело в том, что все мышиные события сначала получает топ-левел окно.
Попробуйте перехватить событие нажатия мыши на данном окне и игнорировать его в случае попадания на кнопку закрытия.
Естественно это событие нужно доставить до кнопки.


Название: Re: Закрыть окно без смены фокуса
Отправлено: Igors от Ноябрь 02, 2015, 12:46
Дело в том, что все мышиные события сначала получает топ-левел окно.
Попробуйте перехватить событие нажатия мыши на данном окне и игнорировать его в случае попадания на кнопку закрытия.
Естественно это событие нужно доставить до кнопки.
Там и кнопки-то никакой нет, просто рисую иконку - все равно нужно рисовать border и.т.д. А перехват на QWindow пробовал - у сожалению, не проходит, фокус уже на окне. Через нативняк (installNativeEventFilter) да, получаю события мыши ДО смены фокуса - но это ж геморрой на 2 платформах  :'(