From 13aef2c0cff94d241569844e02c3dbb3ac301330 Mon Sep 17 00:00:00 2001 From: Alexandr Kondratev Date: Thu, 21 Jul 2016 18:13:42 +0300 Subject: [PATCH] highgui: window_QT mouse wheel support --- modules/highgui/src/window_QT.cpp | 120 +++++++++++++++++------------- modules/highgui/src/window_QT.h | 6 +- 2 files changed, 73 insertions(+), 53 deletions(-) diff --git a/modules/highgui/src/window_QT.cpp b/modules/highgui/src/window_QT.cpp index 70f3586210..619729c99e 100644 --- a/modules/highgui/src/window_QT.cpp +++ b/modules/highgui/src/window_QT.cpp @@ -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; + } } diff --git a/modules/highgui/src/window_QT.h b/modules/highgui/src/window_QT.h index c0769dcc94..16cc9e3853 100644 --- a/modules/highgui/src/window_QT.h +++ b/modules/highgui/src/window_QT.h @@ -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);