C++ 如何使用QCoreApplication::postEvent注入合成输入事件
我正在将通过网络提交的键盘和鼠标事件注入我的Qt应用程序,并为此使用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); 最初我只有一个小
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);
}