我是Qt平台上的c ++程序员。
我想知道,事件如何循环"知道"哪个小部件发送一个事件,主要是鼠标/键盘事件? 它是基于鼠标坐标和z顺序完成的吗? 键盘上的事件怎么样?
由于
答案 0 :(得分:3)
事件循环不知道。这是在其他代码中完成的。
您使用键盘寻找的术语是"焦点"。在整个系统范围内(或多用户系统上每个键盘至少有一个窗口),一个窗口正好具有焦点。操作系统将按键发送到该窗口。 Qt只是从本机窗口句柄中找到Qt对象。同样,鼠标点击主要由操作系统处理。
答案 1 :(得分:0)
它不知道。
如果要捕获事件,则必须创建一个事件过滤器,用于捕获事件或允许传递事件。
这是我之前创建的一个非常简单的事件过滤器:
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上查看这篇写得很好的events文章。