如何在 QMenu 中为 QActions 指定助记符(& 符号快捷方式)?

Posted

技术标签:

【中文标题】如何在 QMenu 中为 QActions 指定助记符(& 符号快捷方式)?【英文标题】:How to specify mnemonics (ampersand shortcut) to QActions in a QMenu? 【发布时间】:2012-02-02 09:33:14 【问题描述】:

我在 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++

【问题讨论】:

【参考方案1】:

您可以创建一个仅在菜单上下文中有效的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,以便它接受键盘输入。

【讨论】:

只是好奇,但你在 Mac OS X 上测试过吗?我猜它会有一些限制,尤其是在应用菜单上的焦点输入/输出方面 我没有在 Mac OS X 上尝试过,没有,但在 Windows XP 上对菜单的关注似乎也有点奇怪。遗憾的是,我没有太多时间来调查这种行为,所以如果他尝试这种方法,我会让 OP 给我们一些更新。 我会在 24 小时内通知你们。感谢 Luc,它看起来很有希望。 我上面的方法没有成功。可能是我忘记了做一些重要的事情,或者在某处设置了一些设置或标志,阻碍了 Luc 的建议(我正在使用我尚未 100% 熟悉的现有代码库)。然而,我确实偶然发现了我自己的解决方案,它使用 Qt 自己的内部工作原理,所以我想它应该在 Mac OSX 上运行良好。我会尽快发布我的解决方案。再次感谢 Luc。【参考方案2】:

后记:

分别使用 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 使用快捷方式填充右列(我在提问之前的内容,非常标准):

手动填充右栏后,还添加助记词:

在我看来,除了表示助记符的下划线之外,它看起来相同。

【讨论】:

我会等待几天的批评和其他建议,然后再接受任何答案。 “最近列表”中的 CTRL+1 看起来与从 QAction 快捷方式字段自动添加的“CTRL+X”完全不同。此解决方案看起来与 &1 没有任何不同。文件名.ext。你仍然添加 &1 并且你想避免它。 @Kamil Klimek:我不确定我明白你在说什么。您的语句 > 据我所知是假的,或者对我的平台/版本的qt等无效。你能详细说明一下吗?另外,我从来没有说过我想避免 &1,只是不让它成为文件菜单中左侧文本的一部分。请仔细阅读我写的内容,如果仍然不清楚,请告诉我。 @Kamil Klimek:看看更新。它们看起来并没有完全不同。 好的,现在将 Project (/tmp/...) 更改为更短或更长的内容。它的行为仍然相同吗?

以上是关于如何在 QMenu 中为 QActions 指定助记符(& 符号快捷方式)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 QToolTips 不会出现在 QMenu 中的 QActions 上

QMenu 中用于 QActions 的 QTooltip

为禁用的 QToolButton 启用 QMenu 访问

如何将 QMenu 中的 QAction 转换为 QWidget?

防止 QMenu 在其 QAction 之一被触发时关闭

指定 QMenu 的左上角位置