В принципе как я и говорил, это заслуга системы шорткаров Qt. (верно для версии 4.7.2)
В самом шорткаре содержится следующая структура:
Клавиша, контекст, enabled, autorepeat, id и ... owner - родитель шорткара.
По нижеследующему коду проверяется следующее -
Контекст шорткара (context), виджет, который привязан к шорткару(owner) и активное окно приложения
Если родитель невидим или отключен - мы убиваем шорткар... В общем то это и есть ответ на ваш вопрос - почему не работает. Потому что такая логика заложена в систему шорткаров Qt при использовании QAction.
Решением проблемы будут QShortcut с родителем в виде главного окна приложения. Правда остаётся проблема надписей, но тут я умываю руки - итак покопался
bool QShortcutMap::correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window) const
{
bool visible = w->isVisible();
#ifdef Q_WS_MAC
if (!qApp->testAttribute(Qt::AA_DontUseNativeMenuBar) && qobject_cast<QMenuBar *>(w))
visible = true;
#endif
if (!visible || !w->isEnabled())
return false;
if (context == Qt::ApplicationShortcut)
return QApplicationPrivate::tryModalHelper(w, 0); // true, unless w is shadowed by a modal dialog
if (context == Qt::WidgetShortcut)
return w == QApplication::focusWidget();
if (context == Qt::WidgetWithChildrenShortcut) {
const QWidget *tw = QApplication::focusWidget();
while (tw && tw != w && (tw->windowType() == Qt::Widget || tw->windowType() == Qt::Popup))
tw = tw->parentWidget();
return tw == w;
}
PS уфф...
PPS я так и не нашёл где напрямую написано это в Assistant, но я думаю что таие строки там есть.