2009-07-17 8 views
1

ユーザーがCtrl + Cをリリースしたときにカスタムコピーコードを呼びたいと思います。 CCtrlより前にリリースされると、QtはQKeySequence::Copyと一致するキーイベントを送信します。 CtrlCより前にリリースされると、リリースイベントは一致しません。キーリリースイベントがCtrlキーとして来ると'C'の前にCtrlを放すと、QtでCtrl + Cキーイベントを捕まえる方法は?

Cはまだ押されているかどうかを確認する方法はありますか?

Ctrlが最初にリリースされたときに、イベントが渡され、通常のコピーが実行されます。これはまったく起こりたくないものです。

bool 
MyWidget::eventFilter(QObject* object, QEvent* event) 
{ 
    // the text edit box filters its events through here 
    if (object == m_text_edit_box) 
    { 
     if (event->type() == QEvent::KeyPress) 
     { 
     QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 

     if (key_event->matches(QKeySequence::Copy)) 
     { 
      // don't do anything and don't pass along event 
      return true; 
     } 
     } 
     else if (event->type() == QEvent::KeyRelease) 
     { 
     QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 

     if (key_event->matches(QKeySequence::Copy)) 
     { 
      // we only get in here if 'c' is released before ctrl 
      callCustomCopy(); 
      return true; 
     } 
     } 
    } 

    // pass along event 
    return false; 
} 

答えて

1

文字 'C'とメタキー 'Ctrl'を特に照会し、key_even-> matches()に依存することはできません。もちろん、keydownイベントのイベントフィルタを配置したオブジェクトにkeydownシーケンスがコピーと一致しているという事実を格納することができます。

この(テストされていない)静的変数は、これが含まれるクラスのメンバ変数である必要があります。これはこの例のコンテキストでははっきりと分かりました。あなたが達成したいと思うものの正確な論理は、イベントの間に運ばれるより多くの状態情報を必要とするかもしれません。

bool MyWidget::eventFilter(QObject* object, QEvent* event) 
{ 
    // Remember state between events 
    static foundCopy = false; 
    // the text edit box filters its events through here 
    if (object == m_text_edit_box) 
    { 
    if (event->type() == QEvent::KeyPress) 
    { 
    QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 
     if (key_event->matches(QKeySequence::Copy)) 
     { 
     foundCopy = true; 
     // don't do anything and don't pass along event 
     return true; 
     } 
     else 
     { 
     foundCopy = false; 
     // This is another sequence, ignore and pass event 
     // Note that this will trigger with ctrl+c+a and others 

     } 
    } 
    else if (event->type() == QEvent::KeyRelease) 
    { 
     QKeyEvent *key_event = static_cast<QKeyEvent*>(event); 
     if (foundCopy) 
     { 
     callCustomCopy(); 
     foundCopy = false; 
     return true; 
     } 
     // This should keep the system copy from triggering 
     if (key_event->matches(QKeySequence::Copy)) 
     { 
     return true; 
     } 
    } 
    } 

    // pass along event 
return false; 
} 

もう一つの方法は、1がリリースされたものがまだ押されているかを確認されている場合、すべての現在の時刻に押されたキーとの実際の状態を収集することです。

UIの観点からは、すべてのキーボード操作はプレス(例:タイプ、ウィンドウペースト)で行われることを覚えておいてください。一般にリリース時のアクションを実行すると、アクション。私は、あなたが達成しようとしていることをあなたの事例から伝えることはできません。

関連する問題