2012-04-19 21 views
1

QT4を使用していて、右クリックのコンテキストメニューを実装するQGLWidgetを作成しました。コンテキストメニューは、マウスの右ボタンがクリックされ、Ctrlキーが押されたときにのみ表示されます。QTコンテキストメニューが表示されているときにkeyReleaseEventが表示されない

Ctrlキーを押したときに制御フラグを設定し、Ctrlキーが離されたときに(keyReleaseEventを介して)これをクリアすることで実装しようとしました。問題は、コンテキストメニューが起動しているときに私がkeyReleaseEventを受け取っていないということです(CTRLだけでなく、キーのリリースもありません)。

例:Ctrlキーを押したままマウスの右ボタンをクリックすると、コンテキストメニューが表示されます(Ctrlキーを押したまま)。メニューで何も選択せずに、私はCtrlキーを離しますが、私のプログラムはkeyPressEventを受け取りません。したがって、私のフラグは決してクリアされず、ユーザが次に右クリックすると(コントロールを保持しなくても)コンテキストメニューが表示されます。

コンテキストメニューが表示されているときに、なぜkeyPressEventが届かないのですか?

私はQT 4.8(C++)を使用しており、WindowsとLinuxの両方で同じ結果をテストしました。

+0

contextMenuEvent経由で、またはkeyPressEvent経由でコンテキストメニューを開きますか? – Anthony

+0

そして明確にするために、コンテキストメニューが消えるようにCTRLを放したいのですか? – Anthony

+0

いいえ、私はマウスのプレスイベント中にexecを使って直接開きますが、CTRLを放した後は開いたままにします。何かが選択されたり他の場所でクリックされたりすると閉じます。 –

答えて

1

Qtはキーボードフォーカスを持っているウィジェット、またはキーボードを明示的につかんでいるウィジェット(QWidget::grabKeyBoard())にキーイベントを送信します。コンテキストメニューは、キーを離した時点のそのウィジェットであるため、リリースイベント。

+0

私はアンソニーの答えが行く方法だろうと知っていましたが、私は主に理由を理由にこれを投稿しました。ありがとう。 –

3

この状況を処理する最善の方法は、コンテキストメニューを開いたときにCTRLが押されたかどうかをチェックすることです。そうすることで、これらの問題を回避し、そのフラグを追跡する必要はありません。これを試してください:

void DerivedClass::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::RightButton && event->modifiers().testFlag(Qt::ControlModifier)) 
    { 
     // Open the context menu. 
    } 
    else 
    { 
     BaseClass::mousePressEvent(event); 
    } 
} 

EDIT:Qt :: ControlModifierではなく、Qt :: ControlModifierです。

+0

私はこれが間違っていることを知っていました。ありがとう!今は素晴らしい作品です。 –

関連する問題