aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickevents_p_p.h
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2021-01-14 19:29:45 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-01-15 15:39:43 +0000
commit76b2d6b7e50ce211641fc6aa9a902719a124e9ca (patch)
treefacbd3e4e58ee0e6fcc1af967c27c939b9eb872b /src/quick/items/qquickevents_p_p.h
parentae8fb3800ac880bfa9805f9163709d96b66b7788 (diff)
Pass QWheelEvent data to QML engine via QQuickWheelEvent pointer
Passing events as objects or references in signal parameters requires copying, and we removed the broken copy semantics from QEvent for Qt 6 as much as possible. QVariant::fromValue still allows creation of a QVariant from a type that doesn't have a (public) copy constructor, which is why this passing of a QWheelEvent through a QVariant to QML went unnoticed. While QWheelEvent is a gadget and thus supposed to be invokable from QML, it's still a QEvent. Most QEvents are not gadgets - like QKeyEvent, QMouseEvent, QTouchEvent. We have QQuick*Event QObject wrappers instead to provide access to the low level event data from QML. So, use a single QQuickWheelEvent object instead to pass the data to QML, that class is designed for exactly that prupose. We need to copy the data anyway, and since we don't need to create/destroy the wrapper object for each event, this has no practical overhead. Extend the QQuickWheelEvent to provide access to the phase information of QWheelEvent as well, and simplify the reset() method. Note: making the QQuickWheelEvent store the QWheelEvent directly would allow passing calls to setAccepted through to the QWheelEvent. That is left for a future cleanup, and another reason for not passing events around as copies. Fixes: QTBUG-89594 Change-Id: Id86a9b30c5a8c7c50091e464e368568a7f5ca2ea Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> (cherry picked from commit 2b15a1fbe2f26a090f79ab5aa238f375bc67fda3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/quick/items/qquickevents_p_p.h')
-rw-r--r--src/quick/items/qquickevents_p_p.h33
1 files changed, 19 insertions, 14 deletions
diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h
index a9aeae2217..91f6c5de23 100644
--- a/src/quick/items/qquickevents_p_p.h
+++ b/src/quick/items/qquickevents_p_p.h
@@ -211,10 +211,12 @@ private:
class QQuickWheelEvent : public QObject
{
Q_OBJECT
+ Q_PROPERTY(const QPointingDevice *device READ pointingDevice CONSTANT)
Q_PROPERTY(qreal x READ x CONSTANT)
Q_PROPERTY(qreal y READ y CONSTANT)
Q_PROPERTY(QPoint angleDelta READ angleDelta CONSTANT)
Q_PROPERTY(QPoint pixelDelta READ pixelDelta CONSTANT)
+ Q_PROPERTY(Qt::ScrollPhase phase READ phase CONSTANT)
Q_PROPERTY(int buttons READ buttons CONSTANT)
Q_PROPERTY(int modifiers READ modifiers CONSTANT)
Q_PROPERTY(bool inverted READ inverted CONSTANT)
@@ -223,40 +225,43 @@ class QQuickWheelEvent : public QObject
QML_ADDED_IN_VERSION(2, 0)
public:
- QQuickWheelEvent()
- : _buttons(Qt::NoButton), _modifiers(Qt::NoModifier)
- {}
+ QQuickWheelEvent() = default;
- void reset(qreal x, qreal y, const QPoint &angleDelta, const QPoint &pixelDelta,
- Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, bool inverted)
+ void reset(const QWheelEvent *event)
{
- _x = x;
- _y = y;
- _angleDelta = angleDelta;
- _pixelDelta = pixelDelta;
- _buttons = buttons;
- _modifiers = modifiers;
+ _device = event->pointingDevice();
+ _x = event->position().x();
+ _y = event->position().y();
+ _angleDelta = event->angleDelta();
+ _pixelDelta = event->pixelDelta();
+ _buttons = event->buttons();
+ _modifiers = event->modifiers();
_accepted = true;
- _inverted = inverted;
+ _inverted = event->inverted();
+ _phase = event->phase();
}
+ const QPointingDevice *pointingDevice() const { return _device; }
qreal x() const { return _x; }
qreal y() const { return _y; }
QPoint angleDelta() const { return _angleDelta; }
QPoint pixelDelta() const { return _pixelDelta; }
int buttons() const { return _buttons; }
int modifiers() const { return _modifiers; }
+ Qt::ScrollPhase phase() const { return _phase; }
bool inverted() const { return _inverted; }
bool isAccepted() { return _accepted; }
void setAccepted(bool accepted) { _accepted = accepted; }
private:
+ const QPointingDevice *_device = nullptr;
qreal _x = 0;
qreal _y = 0;
QPoint _angleDelta;
QPoint _pixelDelta;
- Qt::MouseButtons _buttons;
- Qt::KeyboardModifiers _modifiers;
+ Qt::MouseButtons _buttons = Qt::NoButton;
+ Qt::KeyboardModifiers _modifiers = Qt::NoModifier;
+ Qt::ScrollPhase _phase = Qt::NoScrollPhase;
bool _inverted = false;
bool _accepted = false;
};