我是 Qt 平台上的 C++ 程序员。
我想知道,事件循环如何“知道”向哪个小部件发送事件,主要是鼠标/键盘事件?它是基于鼠标坐标和z-order完成的吗?来自键盘的事件呢?
谢谢
我是 Qt 平台上的 C++ 程序员。
我想知道,事件循环如何“知道”向哪个小部件发送事件,主要是鼠标/键盘事件?它是基于鼠标坐标和z-order完成的吗?来自键盘的事件呢?
谢谢
事件循环不知道。这是在其他代码中完成的。
您在键盘上寻找的术语是“焦点”。恰好一个窗口在系统范围内具有焦点(或在多用户系统上每个键盘至少有一个窗口)。操作系统将击键传递到该窗口。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 文档中查看这篇写得很好的事件文章。