2013-09-17 4 views
5

У меня есть приложение Qt (сервер), которое получает позиции и состояние мыши (нажатие мыши, отпускание или перемещение мыши) по локальной сети из другого приложения 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 и как это может быть сделано.

Благодаря

+0

Настроена 'yourGraphicsView-> setMouseTracking (истина)' для включения обнаружение событий mouseMove? – jbh

ответ

6

Вы должны отправить событие в видовом QWidget так:

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

Можно ли отправить указатель на локальную переменную? –

1

Я думаю, что это будет работать:

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

Он не будет работать как [mouseMoveEvent] (http://qt-project.org/doc/qt-5.0/qtwidgets/qgraphicsview.html#mouseMoveEvent) - защищенный метод. – jbh

+2

Итак, подкласс QGraphicsView и вызовите его из метода подкласса. –

1

В примере, который не работает, является «это» графическое представление? Если это так, вы можете сразу вызвать mouseMoveEvent(), как было предложено Джереми. Если нет, то попробуйте:

QApplication::sendEvent(myGraphicsView, &eve);

Смежные вопросы