Qtのでは、どのメニューにキーボードショートカットを示すが、それらを無効にするには?

StackOverflow https://stackoverflow.com/questions/1894395

質問

私は私のメインウィンドウのメニューにQActionsの束を追加しています。例えば、これらのアクションは、キーボードによってトリガすることができ、私はショートカットがいつものように、メニューに表示されるようにしたいです

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

私はQAction.setShortcut()を使ってこれを行うことができます。しかし、私はのこれらのQActionsはショートカットによってトリガされるのしたくありません。私は別に他の場所ですべてのキーボード入力を処理しています。

これは可能ですか?私はQActionにショートカットを無効にするが、それでも私のメニューのショートカットテキストを(この例では、 Ctrlキー + 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