2

Ctrlユーザーが+を離したときに、カスタムコピーコードを呼び出したいと思いますC。がCリリースされる前にリリースされるCtrlと、Qtは。と一致するキーイベントを送信しますQKeySequence::CopyCtrlがリリースされる前にリリースされた場合C、リリースイベントは一致しません。

キーリリースイベントが発生した場合、まだ保留されているかどうかCtrlを確認する方法はありますか?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;
}
4

1 に答える 1

2

Ctrlkey_even->matches() に依存せずに、文字「C」とメタ キーを具体的にクエリできます。もちろん、keydown イベントで eventfilter を配置したオブジェクトに、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 の観点からは、すべてのキーボード アクションはプレス時に実行されることに注意してください (入力、ウィンドウの貼り付けなど)。リリース時にアクションを実行すると、特にアクションに目に見える結果がある場合は特に、ユーザーを混乱させる可能性があります。あなたの例から、あなたが達成しようとしていることはわかりません。

于 2009-07-17T21:41:25.590 に答える