@@ -40,12 +40,31 @@ bool GlobalShortcutRegistry::hasShortcut(const QVariant &seq) const
41void GlobalShortcutRegistry::addShortcut(const QVariant &seq, GlobalShortcut *sc)
41void GlobalShortcutRegistry::addShortcut(const QVariant &seq, GlobalShortcut *sc)
43− if (!m_shortcuts.keys().contains(seq)) { // create a new entry
44+ if (!m_shortcuts.keys().contains(seq)) { // create a new entry
44− m_shortcuts.insert(seq, {sc});
45+ m_shortcuts.insert(seq, {sc});
45− } else { // append to an existing one
46+ } else { // append to an existing one
46− auto shortcuts = m_shortcuts[seq];
47+ auto shortcuts = m_shortcuts[seq];
47− shortcuts.append(sc);
48+ shortcuts.append(sc);
48− m_shortcuts.insert(seq, shortcuts);
49+ m_shortcuts.insert(seq, shortcuts);
52+ connect(sc, &GlobalShortcut::destroyed, this, &GlobalShortcutRegistry::removeShortcut);
56+void GlobalShortcutRegistry::removeShortcut(QObject *obj)
58+ QMutableMapIterator<QVariant, QVector<QPointer<GlobalShortcut>>> it(m_shortcuts);
59+ while (it.hasNext()) {
61+ GlobalShortcut * scObj = static_cast<GlobalShortcut *>(obj);
62+ if (scObj && it.value().contains(scObj)) {
63+ it.value().removeAll(scObj);
64+ if (it.value().isEmpty()) {
@@ -56,14 +75,15 @@ bool GlobalShortcutRegistry::eventFilter(QObject *obj, QEvent *event)
57 if (event->type() == QEvent::KeyPress) {
76 if (event->type() == QEvent::KeyPress) {
58 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
77 QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
60 QKeySequence seq = QKeySequence(keyEvent->key() + keyEvent->modifiers());
78 QKeySequence seq = QKeySequence(keyEvent->key() + keyEvent->modifiers());
61 if (m_shortcuts.keys().contains(seq)) {
79 if (m_shortcuts.keys().contains(seq)) {
62 const auto shortcuts = m_shortcuts.value(seq);
80 const auto shortcuts = m_shortcuts.value(seq);
63− Q_FOREACH(auto shortcut, shortcuts) {
81+ Q_FOREACH(const auto &shortcut, shortcuts) {
64− qApp->sendEvent(shortcut, keyEvent);
83+ qApp->sendEvent(shortcut, keyEvent);
69 return event->isAccepted();
89 return event->isAccepted();