Thanks a lot for your advice, now it was quite easy.

As you suggested, I post an event when I recieve WindowActivate, and I ignore the mouse release if my custom event occurs between mouse press and mouse release.

If the window is activated by a mouse click, the events are:
  1. WindowActivate (post ActivatedUserEvent here)
  2. MouseButtonPressed (already in Queue)
  3. ActivatedUserEvent (my custom event)
  4. MouseButtonReleased

If the window is activated by Tab, the events are
  1. WindowActivate (post ActivatedUserEvent here)
  2. ActivatedUserEvent (my custom event)
  3. MouseButtonPressed
  4. MouseButtonReleased


The code looks like this:

Qt Code:
  1. bool MyGraphicsView::event(QEvent* event)
  2. {
  3. switch (event->type())
  4. {
  5. case QEvent::WindowActivate:
  6. QCoreApplication::postEvent(this, new QEvent(ActivatedUserEvent));
  7. break;
  8. case Private::ActivatedUserEvent:
  9. ignoreNextMouseRelease = true;
  10. break;
  11. default:
  12. break;
  13. }
  14. return QGraphicsView::event(event);
  15. }
  16.  
  17. void MyGraphicsView::mousePressEvent(QMouseEvent* event)
  18. {
  19. QGraphicsView::mousePressEvent(event);
  20. ignoreNextMouseRelease = false;
  21. }
  22.  
  23. void MyGraphicsView::mouseReleaseEvent(QMouseEvent* event)
  24. {
  25. if (ignoreNextMouseRelease)
  26. {
  27. ignoreNextMouseRelease = false;
  28. return;
  29. }
  30. QGraphicsView::mouseReleaseEvent(event);
  31. }
To copy to clipboard, switch view to plain text mode