99bool QShortcutPrivate::simpleContextMatcher(QObject *object, Qt::ShortcutContext context)
101 auto guiShortcut = qobject_cast<QShortcut *>(object);
102 if (QGuiApplication::applicationState() != Qt::ApplicationActive || guiShortcut ==
nullptr)
104 if (context == Qt::ApplicationShortcut)
106 auto focusWindow = QGuiApplication::focusWindow();
109 auto window = qobject_cast<
const QWindow *>(guiShortcut->parent());
112 if (focusWindow == window && focusWindow->isTopLevel())
113 return context == Qt::WindowShortcut || context == Qt::WidgetWithChildrenShortcut;
114 return focusWindow->isAncestorOf(window, QWindow::ExcludeTransients);
122void QShortcutPrivate::redoGrab(QShortcutMap &map)
125 if (Q_UNLIKELY(!parent)) {
126 qWarning(
"QShortcut: No window parent defined");
130 for (
int id : std::as_const(sc_ids))
131 map.removeShortcut(id, q);
134 if (sc_sequences.isEmpty())
136 sc_ids.reserve(sc_sequences.size());
137 for (
const auto &keySequence : std::as_const(sc_sequences)) {
138 if (keySequence.isEmpty())
140 int id = map.addShortcut(q, keySequence, sc_context, contextMatcher());
143 map.setShortcutEnabled(
false, id, q);
145 map.setShortcutAutoRepeat(
false, id, q);
178QShortcut::QShortcut(
const QKeySequence &key, QObject *parent,
179 const char *member,
const char *ambiguousMember,
180 Qt::ShortcutContext context)
184 d->sc_context = context;
185 if (!key.isEmpty()) {
186 d->sc_sequences = { key };
187 d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
190 connect(
this, SIGNAL(activated()), parent, member);
192 connect(
this, SIGNAL(activatedAmbiguously()), parent, ambiguousMember);
205QShortcut::QShortcut(QKeySequence::StandardKey standardKey, QObject *parent,
206 const char *member,
const char *ambiguousMember,
207 Qt::ShortcutContext context)
211 d->sc_context = context;
212 d->sc_sequences = QKeySequence::keyBindings(standardKey);
213 d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
215 connect(
this, SIGNAL(activated()), parent, member);
217 connect(
this, SIGNAL(activatedAmbiguously()), parent, ambiguousMember);
561bool QShortcut::event(QEvent *e)
564 if (d->sc_enabled && e->type() == QEvent::Shortcut) {
565 auto se =
static_cast<QShortcutEvent *>(e);
566 if (!d->handleWhatsThis()) {
567 Q_ASSERT_X(d->sc_ids.contains(se->shortcutId()),
"QShortcut::event",
"Received shortcut event from wrong shortcut");
568 if (se->isAmbiguous())
569 emit activatedAmbiguously();
575 return QObject::event(e);