9

我将通过网络传入的键盘和鼠标事件注入我的 Qt 应用程序并QCoreApplication::postEvent用于此目的。鼠标坐标是绝对屏幕像素坐标。

QMouseEvent *event = new QMouseEvent(type, QPoint(x, y), mouse_button, mouse_buttons,
    Qt::NoModifier);
QCoreApplication::postEvent(g_qtdraw.main.widget, event);

最初我只有一个小部件(由 引用g_qtdraw.main.widget),所以我只是将那个小部件用作postEvent. 现在我的应用程序有多个小部件,上面的代码不再做我想做的事。

第二个小部件以全屏模式显示,我知道所有鼠标事件都必须转到此窗口,但使用上面的代码,它们仍会路由到主小部件。

如何选择正确的小部件作为接收器(鼠标 x,y 坐标下的那个)?有没有一种标准方法,以便 Qt 选择正确的小部件,还是我必须自己跟踪它?

4

3 回答 3

11

您可以使用QApplication::widgetAt()在该位置找到正确的小部件然后发布到该位置吗?

QPoint pos(x, y);
QMouseEvent *event = new QMouseEvent(type, pos, mouse_button, mouse_buttons,  Qt::NoModifier);
QWidget *receiver = QApplication::widgetAt(pos);
QCoreApplication::postEvent(receiver, event);

不过,我不希望您必须为关键事件执行此操作。它们应该被发送到焦点小部件 ( QApplication::focusWidget())。

不幸的是,我还没有测试过这些。

于 2012-01-05T08:03:41.843 回答
3

我建议根据文档发布一些代码,签名是:

void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]

您是否尝试过将指向相应的指针QObject作为receiver参数?

编辑:注意QWidget继承QObject

于 2012-01-04T22:24:52.180 回答
1

这是添加到问题的答案:

我现在使用以下工作正常(非常感谢Dusty Campbell):

QPoint pos(x, y);
QWidget *receiver = QApplication::widgetAt(pos);
if (receiver) {
    QMouseEvent *event = new QMouseEvent(type, receiver->mapFromGlobal(pos),
        mouse_button, mouse_buttons, Qt::NoModifier);
    QCoreApplication::postEvent(receiver, event);
}
于 2019-12-17T17:51:44.700 回答