5

我在 QMenu 中使用 QActions,典型的

| &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++

4

2 回答 2

3

您可以创建仅在菜单上下文中有效的快捷方式:

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使其接受键盘输入。

于 2012-02-02T11:04:10.913 回答
1

后注:

  • 分别使用 Qt-4.6.3-rh5-x86_64 和 Qt-4.6.4-win32 测试并确认在 linux / windows 上工作。
  • Kamil Klimek 测试并报告无法在 Mac OS X 上运行。

我不完全确定这是否是 Qt 预期功能的一部分,或者只是一个 hack。我找不到任何文档,暗示后者,但它工作得很好,暗示了前者。你是法官,让我/我们知道。

通常的用法是:

// 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 使用快捷方式填充右列(我在提出问题之前所拥有的,非常标准):

手动填充右列并添加助记符后:

除了表示助记符的下划线外,这对我来说看起来是一样的。

于 2012-02-03T14:26:52.743 回答