diff --git a/src/private/qwheelarea.cpp b/src/private/qwheelarea.cpp
index eb06f31f609d95db9fb08620a4c3f8c5cf9aef74..db3b517147ff791c3afbeb1ea548ffe1f3077b25 100644
--- a/src/private/qwheelarea.cpp
+++ b/src/private/qwheelarea.cpp
@@ -43,6 +43,19 @@
 
 QT_BEGIN_NAMESPACE
 
+// On Mac OS X, the scrolling speed in Safari is roughly 2.5 times faster
+// than in TextEdit (the native app). The former is using high-resolution
+// pixel-based delta values as they are, which is fine for a typical web
+// content, whereas the latter evidently makes scrolling slower to make it
+// feel natural and more precise for typical document type of content.
+// => we'll compromise between the two for now, and pick an arbitrary value
+//    to make the pixel-based scrolling speed something between the two
+static const qreal pixelDeltaAdjustment = 0.5;
+
+// The default scroll speed for typical angle-based mouse wheels. The value
+// comes originally from QTextEdit, which sets 20px steps by default.
+static const qreal defaultScrollSpeed = 20.0;
+
 QWheelArea::QWheelArea(QQuickItem *parent)
     : QQuickItem(parent),
       m_horizontalMinimumValue(0),
@@ -53,7 +66,7 @@ QWheelArea::QWheelArea(QQuickItem *parent)
       m_verticalValue(0),
       m_verticalDelta(0),
       m_horizontalDelta(0),
-      m_scrollSpeed(1.0)
+      m_scrollSpeed(defaultScrollSpeed)
 {
 
 }
@@ -65,11 +78,17 @@ QWheelArea::~QWheelArea()
 
 void QWheelArea::wheelEvent(QWheelEvent *we)
 {
-    if (we->orientation() == Qt::Vertical) {
-        setVerticalDelta(we->delta());
-    } else {
-        setHorizontalDelta(we->delta());
+    QPoint numPixels = we->pixelDelta();
+    QPoint numDegrees = we->angleDelta() / 8;
+
+    if (!numPixels.isNull()) {
+        setHorizontalDelta(numPixels.x() * pixelDeltaAdjustment);
+        setVerticalDelta(numPixels.y() * pixelDeltaAdjustment);
+    } else if (!numDegrees.isNull()) {
+        setHorizontalDelta(numDegrees.x() / 15.0 * m_scrollSpeed);
+        setVerticalDelta(numDegrees.y() / 15.0 * m_scrollSpeed);
     }
+
     we->accept();
 }
 
@@ -145,7 +164,7 @@ qreal QWheelArea::verticalValue() const
 
 void QWheelArea::setVerticalDelta(qreal value)
 {
-    m_verticalDelta = m_scrollSpeed * value / 15;
+    m_verticalDelta = value;
     setVerticalValue(m_verticalValue - m_verticalDelta);
 
     emit verticalWheelMoved();
@@ -158,7 +177,7 @@ qreal QWheelArea::verticalDelta() const
 
 void QWheelArea::setHorizontalDelta(qreal value)
 {
-    m_horizontalDelta = value / 15;
+    m_horizontalDelta = value;
     setHorizontalValue(m_horizontalValue - m_horizontalDelta);
 
     emit horizontalWheelMoved();