Russian Qt Forum
Ноябрь 23, 2024, 14:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перекидывать фокус после PopUpContextMenu()  (Прочитано 4181 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Сентябрь 23, 2014, 23:25 »

Есть айтемы на сцене, нажали на одном правую кнопку, словили событие, и вызвали соответствующее PopUpContextMenu(). Всё хорошо.

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

Вот вопрос - как без конструирования своей надстройки над имеющимся контекстным меню (даже не хочется об этом думать) то ли хотя бы закрыть его, если клик правой кнопкой не в него произошел, то ли отобрать у меню фокус при клике куда-то именно правой кнопкой?
« Последнее редактирование: Сентябрь 24, 2014, 12:11 от Гурман » Записан

2^7-1 == 127, задумайтесь...
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Сентябрь 24, 2014, 08:43 »

Кстати да, реально этот момент раздражает. При наличии активного context меню первый клик мышью "пожирается" на его закрытие. Даже приложение не закрыть с первого клика. Может надо какой-нибудь future request в баг трекере Qt замутить?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Сентябрь 24, 2014, 12:13 »

Кстати да, реально этот момент раздражает. При наличии активного context меню первый клик мышью "пожирается" на его закрытие. Даже приложение не закрыть с первого клика. Может надо какой-нибудь future request в баг трекере Qt замутить?

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

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 24, 2014, 14:50 »

Я бы попробовал через хвильтр. Отловить правый press, если мышь снаружи activePopupWidget - закрыть и послать левый press виджету под курсором
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #4 : Сентябрь 24, 2014, 17:26 »

Я бы попробовал через хвильтр. Отловить правый press, если мышь снаружи activePopupWidget - закрыть и послать левый press виджету под курсором

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

2^7-1 == 127, задумайтесь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 24, 2014, 17:49 »

Это где? В каком объекте ловить? В чьем методе, при обработке чего? Закрыть ЧТО?
Фильтр повесить на QApplication. Фильтр получает событие - проверяем правую кнопку. И фильтр получает получателя события - сверяем с activePopupWidget(). После праздников разберетесь  Улыбающийся
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #6 : Сентябрь 24, 2014, 18:47 »

Фильтр повесить на QApplication. Фильтр получает событие - проверяем правую кнопку. И фильтр получает получателя события - сверяем с activePopupWidget().


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

Цитировать
После праздников разберетесь  Улыбающийся

...подозреваю, что это уже в понедельник.  Смеющийся

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


« Последнее редактирование: Сентябрь 24, 2014, 18:50 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #7 : Сентябрь 24, 2014, 21:04 »

Эээммм... QApplication должен быть 1 для приложения как бы...
Насколько я помню при попытке создания второго Qt ругается и выдаёт первый экземпляр.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Сентябрь 24, 2014, 21:16 »

Эээммм... QApplication должен быть 1 для приложения как бы...
Насколько я помню при попытке создания второго Qt ругается и выдаёт первый экземпляр.

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

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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