summaryrefslogtreecommitdiffstats
path: root/src/widgets/kernel
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2023-09-29 17:45:49 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2023-10-11 20:32:05 +0200
commitcd4000a97d325029acab7c253c1774c01ad6f782 (patch)
treec2a9e2cc9d8c7fe0bf73493cd16aebed2323d4cb /src/widgets/kernel
parent7d3417fbfcbfc46061609a842768a0111c5a15a2 (diff)
Use QtGui to match QWindow based shortcuts, even when QApplication is used
If a QShortcut is registered with a QWindow as its parent, but QApplication is used, we end up in QApplicationPrivate::createShortcutPrivate(), and create a QtWidgetsShortcutPrivate that implements shortcut context matching via qWidgetShortcutContextMatcher. The problem is that qWidgetShortcutContextMatcher expects the windows to be QWidgetWindows, which meant that plain QWindow based shortcuts would always fail. This can happen for example if a QApplication is used in Qt Quick to provide dialog fallbacks, but QShortcuts are otherwise used with plain QWindows, or QQuickWindows e.g. We now defer the check of whether there's an active (widget) window, and fall back to QtGui's simpleContextMatcher in case we don't find a QWidget, QAction, or QGraphicsWidget shortcut owner to handle the matching for. Note: We don't support shortcut matching for QAction in QtGui, but this is left for another day. There is also a discrepancy between how QtGui and QtWidgets handles Qt::ApplicationShortcut. The former will treat it as a match even if there is no active QWindow, while the latter requires that there's an active widget window. Fixes: QTBUG-116221 Change-Id: I487995f2e660a40f6556828b84a521d81a58f1b6 Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/widgets/kernel')
-rw-r--r--src/widgets/kernel/qshortcut_widgets.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/widgets/kernel/qshortcut_widgets.cpp b/src/widgets/kernel/qshortcut_widgets.cpp
index cb184ef07d..6e25d79bd6 100644
--- a/src/widgets/kernel/qshortcut_widgets.cpp
+++ b/src/widgets/kernel/qshortcut_widgets.cpp
@@ -65,9 +65,6 @@ bool qWidgetShortcutContextMatcher(QObject *object, Qt::ShortcutContext context)
}
}
- if (!active_window)
- return false;
-
#if QT_CONFIG(action)
if (auto a = qobject_cast<QAction *>(object))
return correctActionContext(context, a, active_window);
@@ -95,14 +92,17 @@ bool qWidgetShortcutContextMatcher(QObject *object, Qt::ShortcutContext context)
}
}
- if (!w)
- return false;
+ if (w)
+ return correctWidgetContext(context, w, active_window);
- return correctWidgetContext(context, w, active_window);
+ return QShortcutPrivate::simpleContextMatcher(object, context);
}
static bool correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window)
{
+ if (!active_window)
+ return false;
+
bool visible = w->isVisible();
#if QT_CONFIG(menubar)
if (auto menuBar = qobject_cast<QMenuBar *>(w)) {
@@ -188,6 +188,9 @@ static bool correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidge
#if QT_CONFIG(graphicsview)
static bool correctGraphicsWidgetContext(Qt::ShortcutContext context, QGraphicsWidget *w, QWidget *active_window)
{
+ if (!active_window)
+ return false;
+
bool visible = w->isVisible();
#if defined(Q_OS_DARWIN) && QT_CONFIG(menubar)
if (!QCoreApplication::testAttribute(Qt::AA_DontUseNativeMenuBar) && qobject_cast<QMenuBar *>(w))
@@ -247,6 +250,9 @@ static bool correctGraphicsWidgetContext(Qt::ShortcutContext context, QGraphicsW
#if QT_CONFIG(action)
static bool correctActionContext(Qt::ShortcutContext context, QAction *a, QWidget *active_window)
{
+ if (!active_window)
+ return false;
+
const QObjectList associatedObjects = a->associatedObjects();
#if defined(DEBUG_QSHORTCUTMAP)
if (associatedObjects.isEmpty())