Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Сентябрь 23, 2014, 23:25



Название: Перекидывать фокус после PopUpContextMenu()
Отправлено: Гурман от Сентябрь 23, 2014, 23:25
Есть айтемы на сцене, нажали на одном правую кнопку, словили событие, и вызвали соответствующее PopUpContextMenu(). Всё хорошо.

Но есть такой момент - если сразу после того, как локальное меню появилось, на этой же сцене отвести курсор на другой айтем и на нём сразу нажать правую кнопку, то мы... словим событие не для этого айтема, а для того, у которого нажали кнопку перед этим. Соответственно появится меню не того айтема, на который был переведен курсор, просто над ним появится меню предыдущего айтема. Что есть явный интерфейсный косяк в приложении. Происходит это потому, что появляющееся меню забирает фокус, и пока явно в сцену левой кнопкой не ткнешь, он у меню остается. Почему-то тыканье в сцену правой кнопкой фокус у меню не забирает, только левой. Простое перемещение курсора по этой сцене hover по айтемам на ней уже не перемещает, методы hoverEnterEvent() для других айтемов сцены не вызываются, итд, пока меню не исчезнет по какой-то причине.

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


Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: xokc от Сентябрь 24, 2014, 08:43
Кстати да, реально этот момент раздражает. При наличии активного context меню первый клик мышью "пожирается" на его закрытие. Даже приложение не закрыть с первого клика. Может надо какой-нибудь future request в баг трекере Qt замутить?


Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: Гурман от Сентябрь 24, 2014, 12:13
Кстати да, реально этот момент раздражает. При наличии активного context меню первый клик мышью "пожирается" на его закрытие. Даже приложение не закрыть с первого клика. Может надо какой-нибудь future request в баг трекере Qt замутить?

Просто правый клик должен также точно переводить фокус, как и левый, а потом уже отрабатываться, как правый клик. И всё. может это и есть уже где-то в глубине Qt, но по-умолчанию почему-то выключено.


Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: Igors от Сентябрь 24, 2014, 14:50
Я бы попробовал через хвильтр. Отловить правый press, если мышь снаружи activePopupWidget - закрыть и послать левый press виджету под курсором


Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: Гурман от Сентябрь 24, 2014, 17:26
Я бы попробовал через хвильтр. Отловить правый press, если мышь снаружи activePopupWidget - закрыть и послать левый press виджету под курсором

Это где? В каком объекте ловить? В чьем методе, при обработке чего? Закрыть ЧТО? Проблема в фокусе. (сорри, мне чичас влом думать, у меня день варенья, вино пью... водку посреди недели нехорошо... вино хорошо... водку буду в пятницу...)


Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: Igors от Сентябрь 24, 2014, 17:49
Это где? В каком объекте ловить? В чьем методе, при обработке чего? Закрыть ЧТО?
Фильтр повесить на QApplication. Фильтр получает событие - проверяем правую кнопку. И фильтр получает получателя события - сверяем с activePopupWidget(). После праздников разберетесь  :)


Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: Гурман от Сентябрь 24, 2014, 18:47
Фильтр повесить на QApplication. Фильтр получает событие - проверяем правую кнопку. И фильтр получает получателя события - сверяем с activePopupWidget().


Эммм... приложение - это конструктор из плагинов. Два из них сейчас внутри себя имеют свои QApplication. Фик его знает, сколько еще таких будет. Проблема обозначилась везде. Впрочем, для главного приложения возможно что-то похожее и можно соорудить, но после N выпитого вина выглядит, как костыль. Надо будет еще посмотреть, но...

Цитировать
После праздников разберетесь  :)

...подозреваю, что это уже в понедельник.  ;D

И все-таки, хотелось бы как-то в ContextMenu вмешаться - так было бы кошернее.




Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: Bepec от Сентябрь 24, 2014, 21:04
Эээммм... QApplication должен быть 1 для приложения как бы...
Насколько я помню при попытке создания второго Qt ругается и выдаёт первый экземпляр.


Название: Re: Перекидывать фокус после PopUpContextMenu()
Отправлено: Гурман от Сентябрь 24, 2014, 21:16
Эээммм... QApplication должен быть 1 для приложения как бы...
Насколько я помню при попытке создания второго Qt ругается и выдаёт первый экземпляр.

Ну да. Там свои QMainWindow. Но для топика не важно.