2

我是 Qt 平台上的 C++ 程序员。

我想知道,事件循环如何“知道”向哪个小部件发送事件,主要是鼠标/键盘事件?它是基于鼠标坐标和z-order完成的吗?来自键盘的事件呢?

谢谢

4

2 回答 2

3

事件循环不知道。这是在其他代码中完成的。

您在键盘上寻找的术语是“焦点”。恰好一个窗口在系统范围内具有焦点(或在多用户系统上每个键盘至少有一个窗口)。操作系统将击键传递到该窗口。Qt 只是从本机窗口句柄中找到 Qt 对象。同样,鼠标点击主要由操作系统处理。

于 2015-01-29T20:01:32.637 回答
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 文档中查看这篇写得很好的事件文章。

于 2015-01-29T20:14:19.173 回答