#qt #menu #key #shortcut
#qt #меню #Клавиша #ярлык
Вопрос:
требуется некоторая быстрая помощь, поскольку я, вероятно, упускаю трюк, который помог бы в этой ситуации в Qt (я использую последнюю версию Qt 4).
В моей QMdiArea я создаю несколько подокон. Ко всем подокнам прикреплено системное меню по умолчанию (свернуть, развернуть, оставаться сверху, закрыть, … — это видно при щелчке правой кнопкой мыши на значке подокна).
Чтобы соответствовать тому, что я определил в главном меню моего приложения (ctrl w виден для закрытия окон), я не могу согласиться с тем, что отображаемый ярлык, связанный с закрытием, равенCtrl F4 в системном меню подокна. Это должно бытьCtrl w. Я пробовал разные вещи, в том числе устанавливал глобальный ярлык для приложения (с помощью setShortcutContext )… но не повезло.
Close по умолчанию имеет два ярлыка: Ctrl w и Ctrl F4. Я хочу, чтобы оба продолжали работать, но это Ctrl w, который всегда должен отображаться.
На данный момент единственным решением, которое я вижу, является замена системного меню (QMenu)… но, похоже, это слишком много кода для такой простой задачи!
Ответ №1:
Вы можете попробовать настроить его таким образом:
ui->mdiArea->subWindowList().at(index)->systemMenu()->actions().last()->setShortcut(QKeySequence(Qt::CTRL Qt::Key_W));
Пожалуйста, замените «индекс» подходящим индексом.
У меня это сработало. (ОБНОВЛЕНИЕ: это не работает, CTRL W уже назначен ярлык для закрытия действия)
Обновить:
Действие закрытия имеет два назначенных ярлыка, и первый отображается в меню. Если вы поменяете порядок, вы получите CTRL W отображается.
QList<QKeySequence> closeShorcuts = ui->mdiArea->subWindowList().at(0)->systemMenu()->actions().last()->shortcuts();
closeShorcuts.swap(0, 1);
ui->mdiArea->subWindowList().at(0)->systemMenu()->actions().last()->setShortcuts(closeShorcuts);
Пожалуйста, обратите внимание, что в этом исходном коде нет проверки платформы; если вы запустите это на MAC, вы получите противоположный результат, и в X11 он выйдет за пределы списка (потому что есть только один ярлык: CTRL W).
Комментарии:
1. Большое спасибо, Луис! Раньше я думал, что длинная строка вызовов функций здесь и там сделает свое дело, не имея возможности понять, как это сделать: я пропустил, что QMenu — это QWidget; И, следовательно, QWidget предоставляет actions() (который возвращает QList). Теперь я действительно вижу CTRL W в своем подокне.
2. Когда я выбираю пункт меню Закрыть с помощью мыши, это работает. Однако… когда я пробую сокращения на клавиатуре (CTRL W и CTRL F4), ни один из них больше не работает (когда это работало ранее). Я пробовал различные параметры setShortcutContext, но это не помогло решить эту новую связанную проблему. Просмотр документов Qt и поиск в Google пока тоже не помогли (все еще поиск — просто обновляю регистр прямо сейчас)
3. Хорошо, я удалил действие закрытия с помощью: pSubWindow-> systemMenu()-> removeAction(pSubWindow-> systemMenu()-> actions().last()); … и мне действительно нравится мое упрощенное подокно таким образом (кнопка закрытия уже есть). Поскольку у меня уже есть действие закрытия, определенное в приложении, я заподозрил там конфликт, поэтому удаление close и добавление уже существующего действия закрытия, я полагаю, также было допустимой возможностью. Спасибо за вашу помощь, очень признателен!
4. Также кажется, что если я хочу запретить повторять ярлыки закрытия (ctrl F4, ctrl W), setAutoRepeat(false), как ни странно, лучше всего ставить перед удалением действия из системного меню подокна: systemMenu()-> actions().last()->setAutoRepeat(false); systemMenu()->removeAction(systemMenu()-> actions().last());
5. Да, это не работает. Кажется, что он конфликтует с ярлыком по умолчанию, выдавая следующее предупреждение: «QAction ::eventFilter: неоднозначная перегрузка ярлыка: Ctrl W». Это потому, что CTRL W уже является ярлыком (в соответствии с ярлыками Qt по умолчанию, doc.qt.nokia.com/4.7/qkeysequence.html#standard-shortcuts ) Но есть трюк, который работает: я отредактирую свой ответ.