Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用QCoreApplication::postEvent注入合成输入事件_C++_Qt_Qcoreapplication - Fatal编程技术网

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

C++ 如何使用QCoreApplication::postEvent注入合成输入事件,c++,qt,qcoreapplication,C++,Qt,Qcoreapplication,我正在将通过网络提交的键盘和鼠标事件注入我的Qt应用程序,并为此使用QCoreApplication::postEvent。鼠标坐标是绝对屏幕像素坐标 QMouseEvent *event = new QMouseEvent(type, QPoint(x, y), mouse_button, mouse_buttons, Qt::NoModifier); QCoreApplication::postEvent(g_qtdraw.main.widget, event); 最初我只有一个小

我正在将通过网络提交的键盘和鼠标事件注入我的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选择正确的小部件,还是我必须自己跟踪它?

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

void QCoreApplication::postEvent ( QObject * receiver, QEvent * event ) [static]
您是否尝试过将指向相应的
QObject
的指针作为
receiver
参数

编辑:请注意,
QWidget
继承了
QObject

您可以使用在该位置找到正确的小部件,然后发布到该位置吗

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()


不幸的是,我没有测试过任何一个问题。

以下是添加到问题中的答案:

现在,我使用了以下功能,效果很好(非常感谢):


我添加了新信息。当我有多个窗口/小部件时,我如何选择正确的窗口/小部件(鼠标x,y下的窗口)?啊,你错过了关于如何决定小部件的关键信息;)谢谢,我是根据你的提示来做的。我还必须使用receiver->mapFromGlobal(pos)以确保坐标正确。请将答案放在答案块中。稍后,你可以接受自己的答案。另请参见@trenki-如果您将答案添加为块中的答案,请让我知道,以便我可以删除此内容。对于这种情况,我们仍然没有办法为OP分配答案。
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);
}