Вы можете получить XEvent
s через:
- функция фильтра, установленная с
QAbstractEventDispatcher::instance()->setEventFilter()
, которая будет получать все XEvent
с.
- функция фильтра, установленная с
qApp->setEventFilter()
, которая будет получать только события, нацеленные на приложение.
- переопределение виртуальной функции
QApplication::x11EventFilter
- переопределение виртуальной функции
QWidget::x11Event
для ваших окон верхнего уровня (дочерние виджеты не получают XEvent
с).
в таком порядке. Если какая-либо из этих функций возвращает true
для какого-либо события, следующая функция не получит это событие.
Некоторые события также могут быть отфильтрованы с помощью Qt между этими функциями, например, QWidget::x11Event
не получает XKeyEvent
s (которые фильтруются функцией QInputContext::x11FilterEvent
виджета с фокусом клавиатуры).
Для более подробной информации, вы должны посмотреть на источники Qt: QEventDispatcher_x11.cpp и функцию QApplication::x11ProcessEvent
в QApplication_x11.cpp
Таким образом, по большей части, если вы переопределите только функцию x11Event
в своем производном классе QDialog
, вы уже должны получить большинство XEvent
. И если вы хотите, чтобы ваши дочерние виджеты тоже получали их, вы можете вручную вызывать их x11Event
функции после переопределения QDialog::x11Event
.
.