LINUX.ORG.RU

Как заграбить нажатие клавиши в qt3 (перехватить KeyPress event)?


0

0

Хочу активировать окно с моим виджетом по клавише. У меня завязан ряд действий в моём окне по нажатию клавиши на клавиатуре и нужно, чтобы они отрабатывались даже когда фокус у меня в другом окне или даже рабочем столе.

Делал раньше подобное на Xlib, там это решилось так:

XGrabKey(display,36,0,RootWindowdisplay,screen_num),True,GrabModeAsync,GrabMode Async)

После этого KeyPress event как раз приходил нужным образом.

Пишу на qt3. Пробовал следующие решения:

1. QWidget::grabKeyboard () - в своём классе порождённом от QWidget. Не работает. Не приходят сообщения о нажатии клавиши когда нет фокуса в моём окне.

2. XGrabKey(x11AppDisplay(), 36, 0, qt_xrootwin(), True, GrabModeAsync, GrabModeAsync).

И переопределял virtual bool x11Event( XEvent* ); в своём QWidgetm, надеясь, что мне туда упадёт нужный KeyEvent. Но он, не падает ни туда, ни в keyPressEvent( QKeyEvent* ). Поведение довольно страннное. При запуске программы нажатие Enter (это её я в данном случае хочу перехватить) не срабатывает т.е. все нажатия блокируются (нет никакой реакции на нажатие клавиши), но у меня в программе нужные сообщения не появляются. После завершения моей программмы всё становится на свои места - Enter снова работает.

Как можно это реализовать это на qt3? Поискал по исходникам kde, там тоже делают через XGrabKey, но не могу понять почему у меня это не срабатывает.

потому что некоторые X11 сообщения могут быть отфильтрованы QApplication. В KDE в KApplication есть методы для добавленения виджета в список слежения, когда он может получать все X11 события (installX11EventFilter). Тебе надо реализовать похожий механизм.

Я не уверен, что XGrabKey вообще нужен. Просто отловить событие нажатия клавиши не пойдёт?

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Да как раз так и сделал. Породился от QApplication, и переопределил x11EventFilter. Я тоже заметил installX11EventFilter, но сразу это сделать, увы, не догадался.

Спасибо!

Praktik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.