如何使用QCoreApplication :: postEvent注入合成输入事件

时间:2012-01-04 15:38:02

标签: c++ qt

我正在将通过网络传入的键盘和鼠标事件注入我的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 coords下的小部件)?有没有标准的方法,所以Qt选择正确的小部件或者我必须自己跟踪它?

修改

我现在使用以下工作正常(非常感谢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);
}

3 个答案:

答案 0 :(得分:9)

您可以使用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())。

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

答案 1 :(得分:3)

我建议根据documentation签名发布一些代码:

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

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

修改请注意QWidget继承QObject

答案 2 :(得分:0)

这是添加到问题中的答案:

  

我现在使用下面的方法效果很好(非常感谢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);
}