Как указать мнемонику (сокращение амперсанда) для QActions в QMenu? - PullRequest
5 голосов
/ 02 февраля 2012

Я использую QActions в QMenu, типичный

| &New file     Ctrl+N |
| &Open file    Ctrl+O |

Который получает хороший контекстный ярлык просто N (для нового файла) и O (для открытого файла), когда меню открыто.

Я бы хотел сделать что-то похожее для просмотра последних файлов, т.е.

| [A recent file]          Ctrl+1  |
| [Another recent file]    Ctrl+2  |
 ... etc

Было бы неплохо установить для мнемонического / контекстного ярлыка соответствующие значения 1 и 2, без без необходимости включать этот номер в текстовое поле:

| &1. [A recent file]          Ctrl+1  |
| &2. [Another recent file]    Ctrl+2  |

Если кто-нибудь знает, как это сделать или может указать мне, как это выяснить, я буду счастлив. Я просмотрел некоторые документы и не могу найти много упоминаний об использовании амперсанда и эквивалентных способах установки мнемонического ярлыка для QActions.

Спасибо.

Ps: Qt-4.7.4-rh6-x86_64, C ++

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Вы можете создать ярлык , действительный только в контексте меню:

QAction * recentFileAction = new QAction( tr("A recent file"), this );
recentFileAction->setShortcut( QKeySequence( tr("Ctrl+1") ) );

QMenu * tools = menuBar()->addMenu( tr("&Tools") );

// Add a shortcut valid only when the tools menu has focus
QShortcut * recentFileShortcut = new QShortcut( QKeySequence( tr("1") ), tools );
recentFileShortcut->setContext( Qt::WidgetShortcut );

connect( recentFileShortcut, SIGNAL(activated()),
         recentFileAction,   SLOT(trigger()));

Возможно, вам потребуется установить политику фокуса меню на Qt::StrongFocus, чтобы оно принимало ввод с клавиатуры.

1 голос
/ 03 февраля 2012

Пост-примечания:

  • Протестировано и подтверждено работа на linux / windows с использованием Qt-4.6.3-rh5-x86_64 и Qt-4.6.4-win32 соответственно.
  • Kamil Klimek протестировал и сообщил, что не работает на Mac OS X.

Я не совсем уверен, является ли это частью предназначенной для Qt функциональности или простохак.То, что я не могу найти какую-либо документацию, намекает на последнее, но то, что она работает так хорошо, предлагает первое.Вы будете судьей и сообщите мне / нам.

Обычное использование было:

// Existing: QMenu* fileMenu_
QAction* action = new QAction("Recent file name", fileMenu_)
action->setShortcut(QKeySequence(QString("CTRL+").append(QString::number(1))));
fileMenu_->addAction(action);

Теперь, по-видимому, Qt заполняет меню файлов в виде таблицы с двумя столбцами.По умолчанию используется метка (имя) в левом столбце и отформатированные сочетания клавиш в правом столбце.

| Recent file name      Ctrl+1 |

Это можно легко настроить с помощью экранированной вкладки.Так что при использовании:

QAction* action = new QAction("Some text\tOther text", fileMenu_)
action->setShortcut(QKeySequence(QString("CTRL+").append(QString::number(1))));

Результат

| Some text       Other text |

При сохранении сочетания клавиш Ctrl + 1 по умолчанию, когда не в фокусе.Это приводит к решению:

QAction* action = new QAction(QString("Recent file name\tCtrl+&%1").arg(i)), fileMenu_)
action->setShortcut(QKeySequence(QString("CTRL+").append(QString::number(i))));

Где переменная i обозначает индекс последнего файла.Это создает именно то, что я имел в виду, а также показывает подчеркивание под номером, которое хорошо указывает на мнемонический ярлык.

Обновление

Просто для демонстрации конечного результатаЯ добавил несколько изображений на случай, если возникнет путаница.

Разрешение Qt заполнить правую колонку с помощью ярлыка (то, что у меня было до того, как задать вопрос, довольно стандартно):

image

После ручного заполнения правого столбца, а также добавления мнемоники:

image

, которые для меня выглядят одинаково, за исключением подчеркивания, обозначающего мнемонику.

...