【问题标题】:Generating (simulating) fake mouse events in Qt在 Qt 中生成(模拟)假鼠标事件
【发布时间】:2013-09-17 12:18:44
【问题描述】:

我有一个 Qt 应用程序(服务器),它通过本地网络从另一个 Qt 应用程序接收鼠标位置和状态(鼠标按下、释放或鼠标移动)。我正确读取了鼠标状态和位置,但我无法在服务器应用程序中生成假消息来模拟鼠标移动、鼠标按下事件。

服务器在 QGraphicsView 中具有处理鼠标移动等的所有逻辑,当它从服务器计算机上的鼠标获得输入时,一切都按预期工作。

但是一旦我尝试通过读取从其他应用程序发送的鼠标位置和状态来生成假 mouseEvents,它就不起作用了。

令人惊讶的是,如果我创建假事件并将其传递给场景,如下所示,它会生成 mouseMoveEvents 但我想为 QGraphicsView 执行此操作,因为它具有在服务器应用程序中处理鼠标的逻辑。

这行得通:

QGraphicsSceneMouseEvent pressEvent(QEvent::GraphicsSceneMousePress);
pressEvent.setScenePos(QPointF(100, 100));
pressEvent.setButton(Qt::LeftButton);
pressEvent.setButtons(Qt::LeftButton);
QApplication::sendEvent(pGraphicsScene, &pressEvent);

这不起作用:

    QMouseEvent eve( (QEvent::MouseMove), QPoint(100,100), 
        Qt::NoButton,
        Qt::NoButton,
        Qt::NoModifier   );

qApp->sendEvent(this , &eve);

谁能帮我理解为什么我不能为 GraphicsView 生成假事件以及如何做到这一点。

谢谢

【问题讨论】:

  • 您是否设置了yourGraphicsView->setMouseTracking(true) 以启用对mouseMove 事件的检测?

标签: c++ qt qt4


【解决方案1】:

您必须像这样将事件发送到视口 QWidget

qApp->sendEvent(viewport(), &eve);

【讨论】:

  • 当我将事件发送到 viewport() 时,事件没有到达目标方法。但是当接收器是这个时,它工作正常!
【解决方案2】:

我认为这会奏效:

QMouseEvent eve( (QEvent::MouseMove), QPoint(100,100), 
    Qt::NoButton,
    Qt::NoButton,
    Qt::NoModifier   );
myGraphicsView->mouseMoveEvent(&eve);

【讨论】:

  • 它不会工作,因为mouseMoveEvent 是一个受保护的方法。
  • 所以继承 QGraphicsView 并从子类的方法中调用它。
【解决方案3】:

在不起作用的示例中,“this”是图形视图吗?如果是这样,那么您可以按照 Jeremy 的建议直接调用 mouseMoveEvent()。如果没有,请尝试:

QApplication::sendEvent(myGraphicsView, &eve);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多