Qtでは、keyPressEventを実装するか、QActionを作成してキーの組み合わせを割り当てることで、キーボードに基づいて動作することができます。KeyPressEventまたはQActionを使用してキーを実装する必要がありますか?
どちらの方法が一般に好ましいですか?
Qtでは、keyPressEventを実装するか、QActionを作成してキーの組み合わせを割り当てることで、キーボードに基づいて動作することができます。KeyPressEventまたはQActionを使用してキーを実装する必要がありますか?
どちらの方法が一般に好ましいですか?
したいキーシーケンスによってトリガーされる同じイベントは、メニュー、ツールバーや他のボタンからのような他の方法によってトリガすることができるいつでもQActionを使用する必要があります。この方法で、同じトリックを行うべきいくつかのウィジェットで同じアクションを使用することができます。 QAction docから
抜粋:
QActionクラスは ウィジェットに挿入することができる抽象 ユーザインターフェイスアクションを提供します。
多くの一般的なコマンド は、メニュー、ツールバーボタン、および のキーボードショートカットから呼び出すことができます。ユーザ は、同様の方法で各コマンドが実行されることを期待しているので、 ユーザインターフェイスに関係なく、 をアクションとして表すと便利です。
あなたが必要なものに依存しますか?
メニュー、ボタン、ツールバーでもトリガーされるアクションのようなメニュー用ですか?それから、QActionに進みます。特に、このアクションが単一のウィジェットだけでなく、プログラム全体で機能する必要がある場合。
これは、1つのウィジェット(たとえば、ゲーム内の動きを制御するなど)のローカルアクティビティによく似ていますか、私はkeypressイベントを使用します。
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);
}
}
QActionを使用すると、実行時に使用するキーの組み合わせを簡単に上書きすることができます。他の方法でもこれを達成することは確かに可能ですが、難しくなります。 – Thomi