「Qtのコントロール - キーボード」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

49行目: 49行目:
*: 未処理のキーイベントを適切に処理するため、デフォルトケースで基底クラスの<code>keyPressEvent</code>を呼び出すことが推奨される。
*: 未処理のキーイベントを適切に処理するため、デフォルトケースで基底クラスの<code>keyPressEvent</code>を呼び出すことが推奨される。
* キーの繰り返し
* キーの繰り返し
*: 長押しによるキーの繰り返しを区別する場合は、QKeyEventクラスのisAutoRepeatメソッドを使用する。
*: 長押しによるキーの繰り返しを区別する場合は、<code>QKeyEvent</code>クラスの<code>isAutoRepeat</code>メソッドを使用する。
* イベントの受理
* イベントの受理
*: 特定のキーイベントを完全に処理したことを示すため、QKeyEventクラスのacceptメソッドを呼び出す。
*: 特定のキーイベントを完全に処理したことを示すため、<code>QKeyEvent</code>クラスの<code>accept</code>メソッドを呼び出す。
<br>
<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
114行目: 114行目:
     if (pEvent->isAutoRepeat()) {
     if (pEvent->isAutoRepeat()) {
       qDebug() << "Key is auto-repeating";
       qDebug() << "Key is auto-repeating";
    }
}
</syntaxhighlight>
<br><br>
== モディファイアキーとの組み合わせ ==
[Ctrl]キーあるいは[Shift]キー等のモディファイアキーと組み合わせる場合は、<code>QKeyEvent</code>クラスの<code>modifiers</code>メソッドを使用する。<br>
<br>
<u>※注意</u><br>
<u>モディファイアキーと組み合わせた特定のアクションを実行する場合、そのアクションが完全にイベントを消費するならば、<code>accept</code>メソッドを実行する。</u><br>
<u>モディファイアキーの状態を記録または確認するだけの場合、<code>accept</code>メソッドは実行せずに、そのイベントを他のハンドラへ渡すほうがよい。</u><br>
<br>
<syntaxhighlight lang="c++">
<syntaxhighlight lang="c++">
// Mainwindow.h
// ...略
protected:
    void keyPressEvent(QKeyEvent *pEvent);
</syntaxhighlight>
<br>
<syntaxhighlight lang="c++">
// Mainwindow.cpp
// 押下したキー名をデバッグ出力する
// その他のキーは、16進数を出力する
void MainWindow::keyPressEvent(QKeyEvent *pEvent)
{
    switch (pEvent->key()) {
      case Qt::Key_0:
          qDebug() << "0(keypad) keyPress";
          pEvent->accept();
          break;
      default:
          qDebug("keyPress %x", pEvent->key());
          QMainWindow::keyPressEvent(pEvent);  // 基底クラスの呼び出し
          break;
    }
    // モディファイアキーの制御
    if (pEvent->modifiers() & Qt::ControlModifier) {
      if (pEvent->key() == Qt::Key_C) {
          // 特定のキーイベントのみを消費する場合
          qDebug() << "[Ctrl] + [C] pressed";
          pEvent->accept();
      }
      else {
          // ロギングのみを行う場合
          qDebug() << "Ctrl is pressed with" << pEvent->key();
      }
    }
    else {
      // それ以外の場合は、基底クラスを呼び出すことにより、他のウィジェットやハンドラがイベントを処理する機会を与えることが可能
      QMainWindow::keyPressEvent(pEvent);  // 基底クラスの呼び出し
     }
     }
  }
  }