Я программист на С ++ на платформе Qt.
Мне интересно, как цикл обработки событий «знает», в какой виджет отправлять события, в основном события мыши / клавиатуры?
Это сделано на основе координат мыши и z-порядка?
А как насчет событий с клавиатуры?
Спасибо
Цикл событий не знает. Это сделано в других битах кода.
Вы ищете с клавиатуры термин «фокус». Ровно одно окно имеет фокус по всей системе (или, по крайней мере, одно окно на клавиатуру в многопользовательских системах). ОС доставляет нажатия клавиш в это окно. Qt просто находит объект Qt из дескриптора собственного окна. Точно так же щелчки мыши в основном обрабатываются ОС.
Это не знает.
Если вы хотите захватить событие, вы должны создать фильтр событий, который либо захватывает событие, либо позволяет передавать его вниз.
Вот очень простой фильтр событий, который я создал некоторое время назад:
bool OGL_widget::eventFilter(QObject *obj, QEvent *event) {
switch (event->type()) {
case QEvent::KeyRelease:
case QEvent::KeyPress: {
QKeyEvent *key = static_cast<QKeyEvent*> (event);
if (!key->isAutoRepeat())
key_event_queue << *key;
}
break;
case 1001:
case 1002: {
Savestate_event *save = static_cast<Savestate_event*> (event);
save_event_queue << *save;
}
break;
}
return QObject::eventFilter(obj, event);
}
Взгляните на эту хорошо написанную статью События на Qt Docs.