Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-124204

[Windows] QMouseEvent gives a wrong mouse position when a context menu is shown

    XMLWordPrintable

Details

    • Bug
    • Resolution: Unresolved
    • P2: Important
    • None
    • 6.6.1
    • None
    • Windows

    Description

      When a context menu is shown in front of the widget, then press and move real quick on a widget, in `mousePressEvent`, `event->position()` sometimes gives a negative value. 

       

      Can reproduce using the code below,

      // MainWindow.h
      
      #ifndef MAINWINDOW_H
      #define MAINWINDOW_H
      
      #include <QMainWindow>
      
      class MyWidget : public QWidget
      {
          Q_OBJECT
      
      public:
          MyWidget();
      
      signals:
          void contextMenu(const QPoint& pos);
      
      public slots:
          void handleContextMenu(const QPoint& pos);
      
      protected:
          void mousePressEvent(QMouseEvent* event) override;
          void mouseReleaseEvent(QMouseEvent* event) override;
      };
      
      class MainWindow : public QMainWindow
      {
          Q_OBJECT
      
      public:
          MainWindow(QWidget *parent = nullptr);
          ~MainWindow();
      };
      
      #endif // MAINWINDOW_H
      
      // MainWindow.cpp
      
      #include "mainwindow.h"
      #include <QMenu>
      #include <QMouseEvent>
      
      MyWidget::MyWidget()
      {
          setAttribute(Qt::WA_NoMousePropagation);
          setFocusPolicy(Qt::ClickFocus);
          setMouseTracking(true);
      
          connect(this, &MyWidget::contextMenu, this, &MyWidget::handleContextMenu);
      }
      
      void MyWidget::handleContextMenu(const QPoint& pos)
      {
          auto menu = new QMenu(this);
          menu->setAttribute(Qt::WA_DeleteOnClose);
      
          menu->addAction("Action 1");
          menu->addAction("Action 2");
          menu->addAction("Action 3");
          menu->addAction("Action 4");
          menu->addAction("Action 5");
      
          menu->popup(mapToGlobal(pos));
      }
      
      void MyWidget::mousePressEvent(QMouseEvent* event)
      {
          emit contextMenu(event->pos());
      }
      
      void MyWidget::mouseReleaseEvent(QMouseEvent* event)
      {
      }
      
      MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent)
      {
          setCentralWidget(new MyWidget);
          resize(200,200);
      }
      
      MainWindow::~MainWindow() {}
       

       

       

      Attachments

        No reviews matched the request. Check your Options in the drop-down menu of this sections header.

        Activity

          People

            qt.team.quick.subscriptions Qt Quick and Widgets Team
            qihao Qihao Cheng
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:

              Gerrit Reviews

                There are no open Gerrit changes