2012-02-02 2 views
4

Я использую QActions в QMenu, типичныйКак указать мнемонику (амперсанд ярлык) на QActions в QMenu?

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

который получает хороший контекст ярлык просто N (для New File) и O (для Open File) в то время как меню открыто.

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

| [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

Вы можете создать shortcut действует только в контексте меню:

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, чтобы он принимал ввод с клавиатуры.

+0

Просто любезно, но вы проверили его на Mac OS X? Я полагаю, что у него будет некоторое ограничение, особенно на фокус в/из меню приложения. –

+0

Я не пробовал это в Mac OS X, нет, но фокус на меню кажется немного странным и для Windows XP. К сожалению, у меня не так много времени, чтобы исследовать это поведение, поэтому я дам ОП дать нам некоторые обновления, если он экспериментирует с этим подходом. –

+0

Я расскажу вам, ребята, через 24 часа. И спасибо Люку, это выглядит многообещающим. – swalog

0

Post-Примечания:

  • Проверено и подтверждено работает на Linux/Windows, используя Qt-4.6.3-RH5-x86_64 и Qt-4.6.4-win32 соответственно.
  • Протестировано и сообщило, что не работает в Mac OS X от Kamil Klimek.

Я не совсем уверен, если это является частью 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 обозначает индекс недавнего файла. Это создает именно то, что я имел в виду, а также показывает подчёркивание под номером, что указывает на мнемонический ярлык.

Update

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

Разрешение Qt для заполнения в правой колонке с ярлыка (то, что я имел, прежде чем задать вопрос, довольно стандартный):

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

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

+0

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

+0

CTRL + 1 в вашем «последнем списке» будет выглядеть полностью отличным от «CTRL + X», автоматически добавленного из поля быстрого доступа QAction. Это решение не отличается от & 1. FileName.Ext. Вы все еще добавляете & 1, и вы хотели избежать этого. –

+0

@Kamil Klimek: Я не уверен, что понимаю, что вы говорите. Ваше заявление << «CTRL + 1 в вашем« последнем списке »будет полностью отличаться от« CTRL + X », автоматически добавленного из поля быстрого доступа QAction». >> насколько я могу сказать false или недействителен для моей платформы/версии qt и т. д. Не могли бы вы рассказать? Кроме того, я никогда не говорил, что хочу избежать & 1, просто не делаю его частью текста левой стороны в меню файла. Пожалуйста, прочитайте то, что я написал немного более тщательно, и дайте мне знать, если все еще неясно. – swalog