在Qt中,如何在菜单中显示键盘快捷键但禁用它们?

dF.*_*dF. 5 qt keyboard-shortcuts menu qt4 pyqt

我在QAction主窗口的菜单中添加了一堆s.这些操作也可以通过键盘触发,我希望快捷方式在菜单中可见,例如

-----------------
|Copy     Ctrl+C|
-----------------
Run Code Online (Sandbox Code Playgroud)

我可以这样做QAction.setShortcut().但是,我不希望这些QAction快捷方式触发这些; 我正在别处处理所有键盘输入.

这可能吗?我可以在QAction中禁用快捷方式但在菜单中仍然有快捷方式文本(在此示例中为Ctrl+ C)吗?

编辑:我最终做的方式是连接菜单aboutToShow()和aboutToHide()事件,启用/禁用快捷方式,使它们仅在显示菜单时处于活动状态.但我很欣赏更清洁的解决方案......

Ida*_*n K 7

您可以从QAction继承并覆盖QAction :: event(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);
    }
};
Run Code Online (Sandbox Code Playgroud)

这将导致发送到您的操作的任何类型为QEvent :: Shortcut的事件不会触发'triggered()'信号.


bay*_*ith 6

action.setText("Copy\tCtrl+C");
Run Code Online (Sandbox Code Playgroud)

这看起来像是带有快捷方式的操作,但实际上并未安装快捷方式。

这是一个完整的示例:

#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();
}
Run Code Online (Sandbox Code Playgroud)