QAction :: setShortcuts()仅响应列表中的第一个快捷方式

时间:2014-05-20 14:31:21

标签: macos qt

我希望多个键盘快捷键触发QAction。根据文档,这可以通过将QKeySequences列表传递给QAction::setShortcuts()来实现,但实际上似乎只使用了列表中的第一个键序列。

我创建了一个演示问题的简短示例。在这里,我试图同时拥有 Meta + K Ctrl + X (这是 Alt + K Cmd + X 在Mac上)触发"我的动作"。在此形式中,只有 Meta + K 才会触发操作。如果交换了两个快捷方式,那么 Ctrl + X 是第一个,那么它将触发动作并且 Meta + K 不会。最后,如果所有快捷方式列表内容都已注释掉并且取消注释了QKeySequence :: Cut的行,则只有 Ctrl + X 才能正常工作the documentation says它映射到Mac上的 Meta + K Ctrl + X 。代码:

#include "mainwindow.h"
#include <QMenuBar>
#include <QAction>

MainWindow::MainWindow() {
    QMenu* menu = new QMenu("Menu");
    menuBar()->addMenu(menu);
    QAction* action = new QAction("My Action", this);
    // Create a list with two shortcuts
    QList<QKeySequence> shortcuts;
    shortcuts.append(QKeySequence(Qt::META + Qt::Key_K));
    shortcuts.append(QKeySequence(Qt::CTRL + Qt::Key_X));
    action->setShortcuts(shortcuts);
    // Alternatively, use one of the QKeySequence::StandardKey enums
    //action->setShortcuts(QKeySequence::Cut);
    connect(action, SIGNAL(triggered()), this, SLOT(doIt()));
    menu->addAction(action);
}

// slot
void MainWindow::doIt() { qDebug("MainWindow::doIt()"); }

如果重要,我使用的是Mac OS X 10.9.2,并且我已经尝试过Qt 5.2.1和Qt 5.3.0。

我包括头文件和main.cpp,以防有人想要复制并粘贴以运行示例,但它们中没有任何有趣或不标准的内容。头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow();

public slots:
    void doIt();
};

#endif // MAINWINDOW_H

main.cpp中:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

1 个答案:

答案 0 :(得分:1)

OS X不支持菜单项的多个键盘快捷键。QAction documentation注释“调用此函数的结果将取决于当前运行的平台”。

看起来根本原因是OS X keeps the menu -> key shortcut mappings in a dictionary以菜单文本为键,值为单个键原子(不是任何类型的集合),因此只能有一个活动键快捷方式每个菜单项。

Here用户发现即使手动为本机应用程序中的同一菜单项添加多个键盘快捷键也不起作用 - 只使用了第一个。