c++ - 如何在 Qt 中模拟具有完整功能的鼠标事件
问题描述
我正在尝试通过来自主机的 UDP 消息远程控制 Qt 应用程序。
目前,远程控制的计算机运行一个接收消息并创建鼠标事件的 Qt 应用程序。只要有新的鼠标事件,主机就会发送类型、按钮、修饰符和位置(介于 0 和 1 之间)。我正在尝试在远程控制计算机中使用这些值创建事件并模仿它们,就像它们是由用户创建的一样。
void MainWindow::slotNewMouseEvent(MouseMsg msg)
{
auto point = scalePoint(msg.x, msg.y); // basic conversion for coordinates
switch(msg.type)
{
case QEvent::MouseButtonPress:
QTest::mousePress(this->childAt(point), (Qt::MouseButton) msg.button,
(Qt::KeyboardModifiers) msg.modifier);
break;
case QEvent::MouseButtonRelease:
QTest::mouseRelease(this->childAt(point), (Qt::MouseButton) msg.button,
(Qt::KeyboardModifiers) msg.modifier);
break;
case QEvent::MouseButtonDblClick:
QTest::mouseDClick(this->childAt(point), (Qt::MouseButton) msg.button,
(Qt::KeyboardModifiers) msg.modifier);
break;
case QEvent::MouseMove:
QTest::mouseMove(this->childAt(point), point);
break;
default:
break;
}
}
void MainWindow::slotNewMouseEvent(MouseMsg msg)
{
auto point = scalePoint(msg.x, msg.y); // basic conversion for coordinates
QMouseEvent *evt = new QMouseEvent((QEvent::Type) msg.type,
point,
(Qt::MouseButton) msg.button,
(Qt::MouseButtons) msg.buttons,
(Qt::KeyboardModifiers) msg.modifier);
qApp->postEvent(this->childAt(point), evt);
// I was expecting funcionalities like this one to be done automatically
if(evt->type() == QEvent::MouseButtonDblClick || evt->type() == QEvent::MouseButtonPress)
{
this->childAt(point)->setFocus();
}
qApp->processEvents();
}
这两个函数都给出了几乎相同的结果,这是不希望的。我期待将新创建的事件发送到屏幕上的顶部小部件会起作用。但是,某些功能,例如将焦点设置在单击的元素上、通过右键单击打开上下文菜单或选择组合框的元素(元素窗口不是小部件)不起作用。
是否有将这些事件保存在远程控制计算机的 Qt 应用程序中的解决方案?我宁愿不使用诸如“windows.h”之类的系统库来防止对系统造成损害并使我的应用程序跨平台。我必须使用它们吗?
解决方案
推荐阅读
- c++ - Eigen 中立方根的性能改进
- informatica - 如何连接多个表并将某个列(在具有不同值的所有表中重复)放入具有一列的单个目标表中
- python - Pytorch:掩码膨胀/扩展
- php - 尝试将 Laravel 从版本 6 升级到 7 时出现问题
- asp.net-core - 激活服务工作者时重新发送请求
- javascript - 如何使丰富的嵌入使用用户的显示颜色 discord.js
- angular - Angular 10 升级:为什么对抽象(组件)类使用 @Directive() 而不是 @Component()?
- python - Scrapy在选择器之外获取文本
- python - tkiner 如何从条目中获取文本并使其全局化
- python - 为什么在 Rossum API 中上传文档时出现此错误,提示解包值太多(预期为 2)?