100bool QShortcutPrivate::simpleContextMatcher(QObject *object, Qt::ShortcutContext context)
102 auto guiShortcut = qobject_cast<QShortcut *>(object);
103 if (QGuiApplication::applicationState() != Qt::ApplicationActive || guiShortcut ==
nullptr)
105 if (context == Qt::ApplicationShortcut)
107 auto focusWindow = QGuiApplication::focusWindow();
110 auto window = qobject_cast<
const QWindow *>(guiShortcut->parent());
113 if (focusWindow == window && focusWindow->isTopLevel())
114 return context == Qt::WindowShortcut || context == Qt::WidgetWithChildrenShortcut;
115 return focusWindow->isAncestorOf(window, QWindow::ExcludeTransients);
123void QShortcutPrivate::redoGrab(QShortcutMap &map)
126 if (Q_UNLIKELY(!parent)) {
127 qWarning(
"QShortcut: No window parent defined");
131 for (
int id : std::as_const(sc_ids))
132 map.removeShortcut(id, q);
135 if (sc_sequences.isEmpty())
137 sc_ids.reserve(sc_sequences.size());
138 for (
const auto &keySequence : std::as_const(sc_sequences)) {
139 if (keySequence.isEmpty())
141 int id = map.addShortcut(q, keySequence, sc_context, contextMatcher());
144 map.setShortcutEnabled(
false, id, q);
146 map.setShortcutAutoRepeat(
false, id, q);
179QShortcut::QShortcut(
const QKeySequence &key, QObject *parent,
180 const char *member,
const char *ambiguousMember,
181 Qt::ShortcutContext context)
185 d->sc_context = context;
186 if (!key.isEmpty()) {
187 d->sc_sequences = { key };
188 d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
191 connect(
this, SIGNAL(activated()), parent, member);
193 connect(
this, SIGNAL(activatedAmbiguously()), parent, ambiguousMember);
206QShortcut::QShortcut(QKeySequence::StandardKey standardKey, QObject *parent,
207 const char *member,
const char *ambiguousMember,
208 Qt::ShortcutContext context)
212 d->sc_context = context;
213 d->sc_sequences = QKeySequence::keyBindings(standardKey);
214 d->redoGrab(QGuiApplicationPrivate::instance()->shortcutMap);
216 connect(
this, SIGNAL(activated()), parent, member);
218 connect(
this, SIGNAL(activatedAmbiguously()), parent, ambiguousMember);
562bool QShortcut::event(QEvent *e)
565 if (d->sc_enabled && e->type() == QEvent::Shortcut) {
566 auto se =
static_cast<QShortcutEvent *>(e);
567 if (!d->handleWhatsThis()) {
568 Q_ASSERT_X(d->sc_ids.contains(se->shortcutId()),
"QShortcut::event",
"Received shortcut event from wrong shortcut");
569 if (se->isAmbiguous())
570 emit activatedAmbiguously();
576 return QObject::event(e);