我添加了一堆QActions的到我的主窗口中的菜单。这些操作也可以通过键盘触发,和我想要的快捷方式菜单中可以看到,像往常一样,例如

-----------------
|Copy     Ctrl+C|
-----------------

我可以使用QAction.setShortcut()做到这一点。然而,我的希望这些QActions通过快捷键触发;我处理所有的键盘输入单独别处。

这是可能的?我可以禁用的QAction快捷,但仍然有快捷的文字(在本例<大骨节病>控制 + <大骨节病> C )在我的菜单?

修改:我最后做它连接到菜单的aboutToShow()aboutToHide()事件,并启用/禁用快捷方式,以便它们仅在显示的菜单积极的方式。不过,我会很感激一个清洁的解决方案...

有帮助吗?

解决方案

您可以从的QAction继承并重写的QAction ::事件(QEvent的*):

class TriggerlessShortcutAction : public QAction
{
public:
    ...ctors...

protected:
    virtual bool event(QEvent* e)
    {
        if (e->type() == QEvent::Shortcut)
            return true;
        else
            return QAction::event(e);
    }
};

这会导致类型的QEvent的任何事件::快捷发送到你的行动,以不触发“触发()”信号。

其他提示

action.setText("Copy\tCtrl+C");

此将看起来像与快捷方式的动作,但该快捷方式实际上没有被安装。

下面是一个完整的示例:

#include <QtGui>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QMainWindow win;

    QMenu *menu = win.menuBar()->addMenu("Test");

    // This action will show Ctrl+T but will not trigger when Ctrl+T is typed.
    QAction *testAction = new QAction("Test\tCtrl+T", &win);
    app.connect(testAction, SIGNAL(triggered(bool)), SLOT(quit()));
    menu->addAction(testAction);

    // This action will show Ctrl+K and will trigger when Ctrl+K is typed.
    QAction *quitAction = new QAction("Quit", &win);
    quitAction->setShortcut(Qt::ControlModifier + Qt::Key_K);
    app.connect(quitAction, SIGNAL(triggered(bool)), SLOT(quit()));
    menu->addAction(quitAction);

    win.show();

    return app.exec();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top