Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Потеря фокуса ввода.


Автор: OlegIT 18.7.2014, 09:55
На форме есть виджет к которому «прикреплены» несколько других виджетов. Эти «прикреплённые» виджеты можно перемещать мышкой. При определённых условиях происходит перестройка этих виджетов, hide, show, изменение координат и поэтому фокус ввода мыши теряется. Его можно возобновить только заново щёлкнув мышкой. Ни какими setFocus, при перестройке конфигурации, решить вопрос не получается. Можно ли как-то ещё перенаправить сообщение он мыши в новый виджет, который находится под курсором?

Автор: Avazart 18.7.2014, 12:38
Цитата(OlegIT @  18.7.2014,  09:55 Найти цитируемый пост)
Ни какими setFocus, при перестройке конфигурации, решить вопрос не получается. 

Почему ? Должно решаться...

Показывай код и/или выкладывай проект.

Автор: OlegIT 21.7.2014, 14:51
В приложении простенький код показывающий проблему.

Не получается "протащить" виджет без остановки.

Автор: Amp 21.7.2014, 16:02
Не разберу что там у тебя с фокусом, но grabMouse/releaseMouse определенно нужно вызывать. Так хотя бы mouseMoveEvent будет прилетать, когда мышь вылезет за пределы диалога.

Автор: OlegIT 21.7.2014, 19:56
Когда мыш выходит за пределы диалога сообщения всё равно приходят в тот виджет на котором был клик, а когда происхолит hide, show сообщение mouseMoveEvent перестают приходить.

Автор: OlegIT 23.7.2014, 12:23
grabMouse/releaseMouse не работает. То есть grabMouse срабатывает, окна перемещаются свободно, без остановке, но сообщение mouseReleaseEvent не вызывается и releaseMouse не вызывается. Больше на окне ни чего не работает и кнопка закрыть программу тоже не доступна.

Автор: Amp 24.7.2014, 16:12
Странно. В твоем примере вызываю grabMouse в mousePressEvent и releaseMouse в mouseReleaseEvent - все хорошо отрабатывает.

Автор: OlegIT 24.7.2014, 20:54
... Заработало, почему-то. Что было не так, в очередной раз так и не понял:)
А в рабочем коде у меня структура посложней и путанней была, видно путанней не только для меня.
Но получается, что сообщение  mouseMoveEvent дочерние окна не получают или опять я где-то напутал?

Автор: math64 25.7.2014, 07:46
Возможно, нужно было пометить, что событие обработано: event->accept() ;
Когда я этого не делал в обработчке правой кнопки мыши после моего контектного меню вызывалось системное.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)