如何在 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 上