Qt菜单快捷方式不适用于OS X.

时间:2017-07-03 17:06:24

标签: c++ macos qt cocoa qt5

我有一个在Debian Linux上开发的Qt 5应用程序,现在我正在移植它并为OS X增强它。当我把它带过来时,所有的菜单快捷方式都出现在表单编辑器中。视觉快捷方式已更改为反映命令键的使用而不是控制键。因此,Login操作的ui文件如下所示:

<action name="LoginAction">
 <property name="text">
  <string>Log in...</string>
 </property>
 <property name="shortcut">
  <string>Ctrl+L</string>
 </property>
</action>

但是,现在唯一可用的键盘快捷键是OS X使用的默认键盘快捷键,例如命令-Q

我在Qt论坛上看到过讨论,它与Qt 5切换到Cocoa的快捷方式有关。这篇文章Keyboard shortcuts - function keys - created in Qt app don't work on OSX提出了我合并的解决方法,

#if defined (Q_OS_MACX)
    ui->LoginAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L));
    ui->LoginAction->setShortcutContext(Qt::ApplicationShortcut);
#endif

但捷径仍然不起作用。 Command-L不会触发LoginAction。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,发现它发生了,因为我没有使用native menu bar。在我的 MainWindow 构造函数中,我定义了这个:

ui->menuBar->setNativeMenuBar(false);

某些操作快捷方式(例如Command+SCommand+O)无效 OSX 。所以,我刚删除了该行,快捷方式现在正常工作。

我找不到此问题的原因,但似乎与 OSX 快捷方式有关。

无论如何,我希望这个答案对你或其他面临同样问题的人有所帮助。

答案 1 :(得分:1)

问题在于使用非OS X原生的菜单。来自非原生菜单操作的快捷方式似乎不会触发任何内容。在UI设计器视图中,您需要检查顶级菜单属性中的本机菜单框,并且需要创建快捷方式应用程序级快捷方式。 QAction属性上有一个复选框。

你也可以这样编程:

QAction *myAction = new QAction("My action");
myAction->setShortcut(QKeySequence("CTRL+M"));
myAction->setShortcutContext(Qt::ApplicationShortcut);

QMenu *myMenu = new QMenu("My Menu");
myMenu->addAction(myAction);
ui->menuBar->addMenu(myMenu);

ui->menuBar->setNativeMenuBar(true);