Qt или любой другой язык. Цикл событий

Я программист на С ++ на платформе Qt.

Мне интересно, как цикл обработки событий «знает», в какой виджет отправлять события, в основном события мыши / клавиатуры?
Это сделано на основе координат мыши и z-порядка?
А как насчет событий с клавиатуры?

Спасибо

2

Решение

Цикл событий не знает. Это сделано в других битах кода.

Вы ищете с клавиатуры термин «фокус». Ровно одно окно имеет фокус по всей системе (или, по крайней мере, одно окно на клавиатуру в многопользовательских системах). ОС доставляет нажатия клавиш в это окно. Qt просто находит объект Qt из дескриптора собственного окна. Точно так же щелчки мыши в основном обрабатываются ОС.

3

Другие решения

Это не знает.

Если вы хотите захватить событие, вы должны создать фильтр событий, который либо захватывает событие, либо позволяет передавать его вниз.

Вот очень простой фильтр событий, который я создал некоторое время назад:

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.

0

По вопросам рекламы [email protected]