首页 > 解决方案 > 如何在 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++qtmouseeventkeyevent

解决方案


推荐阅读