Как в Qt показать сочетания клавиш в меню, но отключить их?
-
19-09-2019 - |
Вопрос
добавляю кучу QAction
s в меню моего главного окна.Эти действия также можно запускать с помощью клавиатуры, и я хочу, чтобы ярлык был виден в меню, как обычно, например.
-----------------
|Copy Ctrl+C|
-----------------
Я могу сделать это, используя QAction.setShortcut()
.Однако я не хочу этих QAction
s запускаться с помощью ярлыков;Я обрабатываю весь ввод с клавиатуры отдельно в другом месте.
Это возможно?Могу ли я отключить ярлык в QAction, но при этом сохранить текст ярлыка (в этом примере Ctrl + С) в моих меню?
РЕДАКТИРОВАТЬ:В итоге я подключился к меню aboutToShow()
и aboutToHide()
события, а также включение/отключение ярлыков, чтобы они были активны только при отображении меню.Но я был бы признателен за более чистое решение...
Решение
Вы можете наследовать от QAction и переопределить QAction::event(QEvent*):
class TriggerlessShortcutAction : public QAction
{
public:
...ctors...
protected:
virtual bool event(QEvent* e)
{
if (e->type() == QEvent::Shortcut)
return true;
else
return QAction::event(e);
}
};
Это приведет к тому, что любые события типа QEvent::Shortcut, отправленные на ваши действия, не будут вызывать сигналы «triggered()».
Другие советы
action.setText("Copy\tCtrl+C");
Это будет выглядеть как действие с ярлыком, но на самом деле ярлык не установлен.
Вот полный пример:
#include <QtGui>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QMainWindow win;
QMenu *menu = win.menuBar()->addMenu("Test");
// This action will show Ctrl+T but will not trigger when Ctrl+T is typed.
QAction *testAction = new QAction("Test\tCtrl+T", &win);
app.connect(testAction, SIGNAL(triggered(bool)), SLOT(quit()));
menu->addAction(testAction);
// This action will show Ctrl+K and will trigger when Ctrl+K is typed.
QAction *quitAction = new QAction("Quit", &win);
quitAction->setShortcut(Qt::ControlModifier + Qt::Key_K);
app.connect(quitAction, SIGNAL(triggered(bool)), SLOT(quit()));
menu->addAction(quitAction);
win.show();
return app.exec();
}