highgui: window_QT mouse wheel support
authorAlexandr Kondratev <theg4sh@gmail.com>
Thu, 21 Jul 2016 15:13:42 +0000 (18:13 +0300)
committerAlexandr Kondratev <theg4sh@gmail.com>
Thu, 21 Jul 2016 15:13:42 +0000 (18:13 +0300)
modules/highgui/src/window_QT.cpp
modules/highgui/src/window_QT.h

index 70f3586..619729c 100644 (file)
@@ -2630,17 +2630,17 @@ void DefaultViewPort::resizeEvent(QResizeEvent* evnt)
 void DefaultViewPort::wheelEvent(QWheelEvent* evnt)
 {
     int delta = evnt->delta();
-    int cv_event = -1;
-    int flags = ((delta & 0xffff)<<16) | ((evnt->orientation() == Qt::Vertical) ? CV_EVENT_MOUSEWHEEL : CV_EVENT_MOUSEHWHEEL);
+    int cv_event = ((evnt->orientation() == Qt::Vertical) ? CV_EVENT_MOUSEWHEEL : CV_EVENT_MOUSEHWHEEL);
+    int flags = (delta & 0xffff)<<16;
     QPoint pt = evnt->pos();
 
-    icvmouseHandler(evnt, mouse_wheel, cv_event, flags);
-    icvmouseProcessing(QPoingF(pt), cv_event, flags);
+    icvmouseHandler((QMouseEvent*)evnt, mouse_wheel, cv_event, flags);
+    icvmouseProcessing(QPointF(pt), cv_event, flags);
 
     scaleView(delta / 240.0, pt);
     viewport()->update();
 
-    QWidget::mouseWheel(evnt);
+    QWidget::wheelEvent(evnt);
 }
 
 
@@ -2857,7 +2857,9 @@ void DefaultViewPort::icvmouseHandler(QMouseEvent *evnt, type_mouse_event catego
     Qt::KeyboardModifiers modifiers = evnt->modifiers();
     Qt::MouseButtons buttons = evnt->buttons();
 
-    flags = 0;
+    // This line gives excess flags flushing, with it you cannot predefine flags value.
+    // icvmouseHandler called with flags == 0 where it really need.
+    //flags = 0;
     if(modifiers & Qt::ShiftModifier)
         flags |= CV_EVENT_FLAG_SHIFTKEY;
     if(modifiers & Qt::ControlModifier)
@@ -2872,23 +2874,24 @@ void DefaultViewPort::icvmouseHandler(QMouseEvent *evnt, type_mouse_event catego
     if(buttons & Qt::MidButton)
         flags |= CV_EVENT_FLAG_MBUTTON;
 
-    cv_event = CV_EVENT_MOUSEMOVE;
-    switch(evnt->button())
-    {
-    case Qt::LeftButton:
-        cv_event = tableMouseButtons[category][0];
-        flags |= CV_EVENT_FLAG_LBUTTON;
-        break;
-    case Qt::RightButton:
-        cv_event = tableMouseButtons[category][1];
-        flags |= CV_EVENT_FLAG_RBUTTON;
-        break;
-    case Qt::MidButton:
-        cv_event = tableMouseButtons[category][2];
-        flags |= CV_EVENT_FLAG_MBUTTON;
-        break;
-    default:;
-    }
+    if (cv_event == -1)
+        switch(evnt->button())
+        {
+        case Qt::LeftButton:
+            cv_event = tableMouseButtons[category][0];
+            flags |= CV_EVENT_FLAG_LBUTTON;
+            break;
+        case Qt::RightButton:
+            cv_event = tableMouseButtons[category][1];
+            flags |= CV_EVENT_FLAG_RBUTTON;
+            break;
+        case Qt::MidButton:
+            cv_event = tableMouseButtons[category][2];
+            flags |= CV_EVENT_FLAG_MBUTTON;
+            break;
+        default:
+            cv_event = CV_EVENT_MOUSEMOVE;
+        }
 }
 
 
@@ -3191,6 +3194,22 @@ void OpenGlViewPort::paintGL()
         glDrawCallback(glDrawData);
 }
 
+void OpenGlViewPort::wheelEvent(QWheelEvent* evnt)
+{
+    int delta = evnt->delta();
+    int cv_event = ((evnt->orientation() == Qt::Vertical) ? CV_EVENT_MOUSEWHEEL : CV_EVENT_MOUSEHWHEEL);
+    int flags = (delta & 0xffff)<<16;
+    QPoint pt = evnt->pos();
+
+    icvmouseHandler((QMouseEvent*)evnt, mouse_wheel, cv_event, flags);
+    icvmouseProcessing(QPointF(pt), cv_event, flags);
+
+    scaleView(delta / 240.0, pt);
+    viewport()->update();
+
+    QWidget::wheelEvent(evnt);
+}
+
 void OpenGlViewPort::mousePressEvent(QMouseEvent* evnt)
 {
     int cv_event = -1, flags = 0;
@@ -3244,42 +3263,41 @@ void OpenGlViewPort::icvmouseHandler(QMouseEvent* evnt, type_mouse_event categor
     Qt::KeyboardModifiers modifiers = evnt->modifiers();
     Qt::MouseButtons buttons = evnt->buttons();
 
-    flags = 0;
-    if (modifiers & Qt::ShiftModifier)
+    // This line gives excess flags flushing, with it you cannot predefine flags value.
+    // icvmouseHandler called with flags == 0 where it really need.
+    //flags = 0;
+    if(modifiers & Qt::ShiftModifier)
         flags |= CV_EVENT_FLAG_SHIFTKEY;
-    if (modifiers & Qt::ControlModifier)
+    if(modifiers & Qt::ControlModifier)
         flags |= CV_EVENT_FLAG_CTRLKEY;
-    if (modifiers & Qt::AltModifier)
+    if(modifiers & Qt::AltModifier)
         flags |= CV_EVENT_FLAG_ALTKEY;
 
-    if (buttons & Qt::LeftButton)
-        flags |= CV_EVENT_FLAG_LBUTTON;
-    if (buttons & Qt::RightButton)
-        flags |= CV_EVENT_FLAG_RBUTTON;
-    if (buttons & Qt::MidButton)
-        flags |= CV_EVENT_FLAG_MBUTTON;
-
-    cv_event = CV_EVENT_MOUSEMOVE;
-    switch (evnt->button())
-    {
-    case Qt::LeftButton:
-        cv_event = tableMouseButtons[category][0];
+    if(buttons & Qt::LeftButton)
         flags |= CV_EVENT_FLAG_LBUTTON;
-        break;
-
-    case Qt::RightButton:
-        cv_event = tableMouseButtons[category][1];
+    if(buttons & Qt::RightButton)
         flags |= CV_EVENT_FLAG_RBUTTON;
-        break;
-
-    case Qt::MidButton:
-        cv_event = tableMouseButtons[category][2];
+    if(buttons & Qt::MidButton)
         flags |= CV_EVENT_FLAG_MBUTTON;
-        break;
 
-    default:
-        ;
-    }
+    if (cv_event == -1)
+        switch(evnt->button())
+        {
+        case Qt::LeftButton:
+            cv_event = tableMouseButtons[category][0];
+            flags |= CV_EVENT_FLAG_LBUTTON;
+            break;
+        case Qt::RightButton:
+            cv_event = tableMouseButtons[category][1];
+            flags |= CV_EVENT_FLAG_RBUTTON;
+            break;
+        case Qt::MidButton:
+            cv_event = tableMouseButtons[category][2];
+            flags |= CV_EVENT_FLAG_MBUTTON;
+            break;
+        default:
+            cv_event = CV_EVENT_MOUSEMOVE;
+        }
 }
 
 
index c0769dc..16cc9e3 100644 (file)
@@ -366,12 +366,13 @@ private slots:
 };
 
 
-enum type_mouse_event { mouse_up = 0, mouse_down = 1, mouse_dbclick = 2, mouse_move = 3 };
+enum type_mouse_event { mouse_up = 0, mouse_down = 1, mouse_dbclick = 2, mouse_move = 3, mouse_wheel = 4 };
 static const int tableMouseButtons[][3]={
     {CV_EVENT_LBUTTONUP, CV_EVENT_RBUTTONUP, CV_EVENT_MBUTTONUP},               //mouse_up
     {CV_EVENT_LBUTTONDOWN, CV_EVENT_RBUTTONDOWN, CV_EVENT_MBUTTONDOWN},         //mouse_down
     {CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK, CV_EVENT_MBUTTONDBLCLK},   //mouse_dbclick
-    {CV_EVENT_MOUSEMOVE, CV_EVENT_MOUSEMOVE, CV_EVENT_MOUSEMOVE}                //mouse_move
+    {CV_EVENT_MOUSEMOVE, CV_EVENT_MOUSEMOVE, CV_EVENT_MOUSEMOVE},               //mouse_move
+    {0, 0, 0}                                                                   //mouse_wheel, to prevent exceptions in code
 };
 
 
@@ -436,6 +437,7 @@ protected:
     void resizeGL(int w, int h);
     void paintGL();
 
+    void wheelEvent(QWheelEvent* event);
     void mouseMoveEvent(QMouseEvent* event);
     void mousePressEvent(QMouseEvent* event);
     void mouseReleaseEvent(QMouseEvent* event);