2011-01-26 9 views

答えて

5

したいキーシーケンスによってトリガーされる同じイベントは、メニュー、ツールバーや他のボタンからのような他の方法によってトリガすることができるいつでもQActionを使用する必要があります。この方法で、同じトリックを行うべきいくつかのウィジェットで同じアクションを使用することができます。 QAction docから

抜粋:

QActionクラスは ウィジェットに挿入することができる抽象 ユーザインターフェイスアクションを提供します。

多くの一般的なコマンド は、メニュー、ツールバーボタン、および のキーボードショートカットから呼び出すことができます。ユーザ は、同様の方法で各コマンドが実行されることを期待しているので、 ユーザインターフェイスに関係なく、 をアクションとして表すと便利です。

+0

QActionを使用すると、実行時に使用するキーの組み合わせを簡単に上書きすることができます。他の方法でもこれを達成することは確かに可能ですが、難しくなります。 – Thomi

1

あなたが必要なものに依存しますか?

メニュー、ボタン、ツールバーでもトリガーされるアクションのようなメニュー用ですか?それから、QActionに進みます。特に、このアクションが単一のウィジェットだけでなく、プログラム全体で機能する必要がある場合。

これは、1つのウィジェット(たとえば、ゲーム内の動きを制御するなど)のローカルアクティビティによく似ていますか、私はkeypressイベントを使用します。

2

keyPressEventを上書きすることをお勧めします。私はQActionのアイデアがどこかにあるのを好きではない。 keyPressedEventを上書きするだけです。私は通常、押されたキーをチェックするスイッチケースでそれを行います。キーの標準的な動作を無効にしたくない場合は、基本クラスのkeyPressEventを呼び出すことを忘れないでください。さらに、keyPressEventが発生している間に「修飾子」が押されているかどうかを確認することができます。 (ShiftやCtrlなど)。 keyPressEventを上書きする一般的な目的のためのIMHOは、ユーザーに表示されるすべてのアクションをアプリケーションに含める場合を除いて、目に見えない秘密のアクションを作成するよりも優れています。

void my_widget::keyPressEvent(QKeyEvent* p_event) 
{ 
    bool ctrl_pressed = false; 

    if(p_event->modifiers() == Qt::ControlModifier) 
    { 
     ctrl_pressed = true; 
    } 

    switch(p_event->key()) 
    { 
    case Qt::Key_F: 
     focus_view(); 
     break; 

    case Qt::Key_I: 
     if(ctrl_pressed) 
     { 
      toggle_interface(); 
     } 
     else 
     { 
      QWidget::keyPressEvent(p_event); 
     } 
     break; 

    case Qt::Key_Return: // return key 
    case Qt::Key_Enter:  // numpad enter key 
     update_something(); 
     break; 

    default: 
     QSpinBox::keyPressEvent(p_event); 
    } 
} 
関連する問題