diff options
author | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-05-02 09:20:48 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@digia.com> | 2013-05-02 10:13:17 +0300 |
commit | a5499c546bffba0a53fd36458e08c1ad5bd8b384 (patch) | |
tree | 19c4c3979754d39a1930d6b8a488831e27fd771d /plugins | |
parent | 232715f311f87d970af3224150a8687907c72071 (diff) |
Fix mouse events for QtQuick2
Change-Id: Ibb6b80765c6433a47670046ca72e156c697b1f97
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/declarative/declarativechart.cpp | 82 | ||||
-rw-r--r-- | plugins/declarative/declarativechart.h | 10 |
2 files changed, 91 insertions, 1 deletions
diff --git a/plugins/declarative/declarativechart.cpp b/plugins/declarative/declarativechart.cpp index 59109791..9d3fcd0e 100644 --- a/plugins/declarative/declarativechart.cpp +++ b/plugins/declarative/declarativechart.cpp @@ -41,6 +41,12 @@ #include "qdatetimeaxis.h" #endif +#ifdef CHARTS_FOR_QUICK2 +#include <QGraphicsSceneMouseEvent> +#include <QGraphicsSceneHoverEvent> +#include <QApplication> +#endif + QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! @@ -261,6 +267,9 @@ void DeclarativeChart::initChart(QChart::ChartType type) setAntialiasing(QQuickItem::antialiasing()); connect(m_scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(update())); connect(this, SIGNAL(antialiasingChanged(bool)), this, SLOT(handleAntialiasingChanged(bool))); + + setAcceptedMouseButtons(Qt::AllButtons); + setAcceptHoverEvents(true); #else if (type == QChart::ChartTypePolar) m_chart = new QPolarChart(this); @@ -386,7 +395,6 @@ void DeclarativeChart::handleAxisYRightSet(QAbstractAxis *axis) void DeclarativeChart::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { -// qDebug() << "DeclarativeChart::geometryChanged" << newGeometry.width() << newGeometry.height(); if (newGeometry.isValid()) { if (newGeometry.width() > 0 && newGeometry.height() > 0) { m_chart->resize(newGeometry.width(), newGeometry.height()); @@ -407,6 +415,78 @@ void DeclarativeChart::paint(QPainter *painter) m_scene->render(painter, renderRect, renderRect); } +void DeclarativeChart::mousePressEvent(QMouseEvent *event) +{ + m_mousePressScenePoint = event->pos(); + m_mousePressScreenPoint = event->globalPos(); + m_lastMouseMoveScenePoint = m_mousePressScenePoint; + m_lastMouseMoveScreenPoint = m_mousePressScreenPoint; + m_mousePressButton = event->button(); + m_mousePressButtons = event->buttons(); + + QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMousePress); + mouseEvent.setWidget(0); + mouseEvent.setButtonDownScenePos(m_mousePressButton, m_mousePressScenePoint); + mouseEvent.setButtonDownScreenPos(m_mousePressButton, m_mousePressScreenPoint); + mouseEvent.setScenePos(m_mousePressScenePoint); + mouseEvent.setScreenPos(m_mousePressScreenPoint); + mouseEvent.setLastScenePos(m_lastMouseMoveScenePoint); + mouseEvent.setLastScreenPos(m_lastMouseMoveScreenPoint); + mouseEvent.setButtons(m_mousePressButtons); + mouseEvent.setButton(m_mousePressButton); + mouseEvent.setModifiers(event->modifiers()); + mouseEvent.setAccepted(false); + + QApplication::sendEvent(m_scene, &mouseEvent); +} + +void DeclarativeChart::mouseReleaseEvent(QMouseEvent *event) +{ + QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseRelease); + mouseEvent.setWidget(0); + mouseEvent.setButtonDownScenePos(m_mousePressButton, m_mousePressScenePoint); + mouseEvent.setButtonDownScreenPos(m_mousePressButton, m_mousePressScreenPoint); + mouseEvent.setScenePos(event->pos()); + mouseEvent.setScreenPos(event->globalPos()); + mouseEvent.setLastScenePos(m_lastMouseMoveScenePoint); + mouseEvent.setLastScreenPos(m_lastMouseMoveScreenPoint); + mouseEvent.setButtons(event->buttons()); + mouseEvent.setButton(event->button()); + mouseEvent.setModifiers(event->modifiers()); + mouseEvent.setAccepted(false); + + QApplication::sendEvent(m_scene, &mouseEvent); + + m_mousePressButtons = event->buttons(); + m_mousePressButton = Qt::NoButton; +} + +void DeclarativeChart::hoverMoveEvent(QHoverEvent *event) +{ + // Convert hover move to mouse move, since we don't seem to get actual mouse move events. + // QGraphicsScene generates hover events from mouse move events, so we don't need + // to pass hover events there. + QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseMove); + mouseEvent.setWidget(0); + mouseEvent.setButtonDownScenePos(m_mousePressButton, m_mousePressScenePoint); + mouseEvent.setButtonDownScreenPos(m_mousePressButton, m_mousePressScreenPoint); + mouseEvent.setScenePos(event->pos()); + // Hover events do not have global pos in them, and the screen position doesn't seem to + // matter anyway in this use case, so just pass event pos instead of trying to + // calculate the real screen position. + mouseEvent.setScreenPos(event->pos()); + mouseEvent.setLastScenePos(m_lastMouseMoveScenePoint); + mouseEvent.setLastScreenPos(m_lastMouseMoveScreenPoint); + mouseEvent.setButtons(m_mousePressButtons); + mouseEvent.setButton(m_mousePressButton); + mouseEvent.setModifiers(event->modifiers()); + m_lastMouseMoveScenePoint = mouseEvent.scenePos(); + m_lastMouseMoveScreenPoint = mouseEvent.screenPos(); + mouseEvent.setAccepted(false); + + QApplication::sendEvent(m_scene, &mouseEvent); +} + void DeclarativeChart::handleAntialiasingChanged(bool enable) { setAntialiasing(enable); diff --git a/plugins/declarative/declarativechart.h b/plugins/declarative/declarativechart.h index c02434e4..9fa45546 100644 --- a/plugins/declarative/declarativechart.h +++ b/plugins/declarative/declarativechart.h @@ -111,6 +111,10 @@ public: // From parent classes void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); #ifdef CHARTS_FOR_QUICK2 void paint(QPainter *painter); +protected: + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void hoverMoveEvent(QHoverEvent *event); private Q_SLOTS: void handleAntialiasingChanged(bool enable); #endif @@ -198,6 +202,12 @@ private: QChart *m_chart; #ifdef CHARTS_FOR_QUICK2 QGraphicsScene *m_scene; + QPointF m_mousePressScenePoint; + QPoint m_mousePressScreenPoint; + QPointF m_lastMouseMoveScenePoint; + QPoint m_lastMouseMoveScreenPoint; + Qt::MouseButton m_mousePressButton; + Qt::MouseButtons m_mousePressButtons; #endif DeclarativeMargins *m_margins; }; |