Don't set focus when moving the cursor with a touch pad

On macOS, swiping with a single finger on the track pad (which Qt
identifies as a QInputDevice::DeviceType::TouchPad) results in a
TouchBegin event. For widgets that accept touch events (perhaps
implicitly because they want pan gestures, like QGraphicsView),
this results in a TouchBegin event to be delivered.

QApplication::notify will then check the widget's focus policy, and with
ClickFocus set, will set focus on the widget.

This is not what we want for a TouchBegin on a touch pad, so skip the
setting of the focus for that device type.

Pick-to: 6.5
Fixes: QTBUG-112922
Change-Id: Ie828793a784cc0e2fa47954bf5b396d6a44bd5e8
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Volker Hilsheimer 2023-04-26 19:15:58 +02:00
parent c2f01d4cfb
commit 127e33d4c6

View File

@ -3062,7 +3062,8 @@ bool QApplication::notify(QObject *receiver, QEvent *e)
bool eventAccepted = touchEvent->isAccepted();
bool acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
if (acceptTouchEvents && e->spontaneous()) {
if (acceptTouchEvents && e->spontaneous()
&& touchEvent->device()->type() != QInputDevice::DeviceType::TouchPad) {
const QPoint localPos = touchEvent->points()[0].position().toPoint();
QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, localPos);
}