Qt WidgetsでQGesture::stateを使用してジェスチャーを認識する


QGesture::state は、ジェスチャーの状態を表すプロパティです。ジェスチャーは、ユーザーがタッチスクリーンやマウスを使用して実行する操作を表します。QGesture::state には、ジェスチャーが開始された、更新された、完了した、またはキャンセルされたなど、さまざまな状態があります。

状態

QGesture::state には、以下の状態があります。

  • Qt::GestureCanceled
    ジェスチャーがキャンセルされたことを示します。
  • Qt::GestureFinished
    ジェスチャーが完了したことを示します。
  • Qt::GestureUpdated
    ジェスチャーが更新されたことを示します。これは、ジェスチャーが進行中であることを意味します。
  • Qt::GestureStarted
    ジェスチャーが開始されたことを示します。

使用方法

QGesture::state は、ジェスチャーの状態を把握するために使用できます。たとえば、ジェスチャーが開始されたときに特定のアクションを実行したり、ジェスチャーが更新されたときにジェスチャーの位置を追跡したりするために使用できます。

以下の例では、ジェスチャーが開始されたときにラベルのテキストを "ジェスチャー開始" に変更し、ジェスチャーが完了したときにラベルのテキストを "ジェスチャー完了" に変更する方法を示します。

void MyWidget::gestureEvent(QGestureEvent *event) {
  if (event->type() == QEvent::Gesture) {
    QGesture *gesture = event->gesture(Qt::PinchGesture);
    if (gesture) {
      if (gesture->state() == Qt::GestureStarted) {
        label->setText("ジェスチャー開始");
      } else if (gesture->state() == Qt::GestureFinished) {
        label->setText("ジェスチャー完了");
      }
    }
  }
}
  • QGesture::state は、読み取り専用のプロパティです。


#include <QApplication>
#include <QLabel>
#include <QGestureRecognizer>
#include <QPinchGesture>

class MyWidget : public QLabel {
public:
  MyWidget(QWidget *parent = nullptr);

protected:
  void gestureEvent(QGestureEvent *event) override;
};

MyWidget::MyWidget(QWidget *parent) : QLabel(parent) {
  setText("ピンチで拡大・縮小");

  // ピンチジェスチャー認識器を登録する
  QGestureRecognizer *recognizer = new QGestureRecognizer(this);
  recognizer->registerRecognizer(new QPinchGesture);
}

void MyWidget::gestureEvent(QGestureEvent *event) {
  if (event->type() == QEvent::Gesture) {
    QGesture *gesture = event->gesture(Qt::PinchGesture);
    if (gesture) {
      // ジェスチャーの状態を取得する
      QGesture::State state = gesture->state();

      // ジェスチャーが開始された場合
      if (state == Qt::GestureStarted) {
        // 開始時のスケールを保存する
        startScale = scale();
      } else if (state == Qt::GestureUpdated) {
        // スケールを更新する
        scaleFactor = gesture->scaleFactor();
        scale = startScale * scaleFactor;

        // ラベルのスケールを変更する
        updateGeometry();
      }
    }
  }
}

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  MyWidget widget;
  widget.show();

  return app.exec();
}

説明

このコードは次のように動作します。

  1. MyWidget コンストラクタで、ピンチジェスチャー認識器を登録します。
  2. gestureEvent() メソッドは、ジェスチャーイベントを処理します。
  3. ジェスチャーイベントのタイプが QEvent::Gesture である場合、event->gesture() メソッドを使用してジェスチャーを取得します。
  4. ジェスチャーがピンチジェスチャーである場合、gesture->state() メソッドを使用してジェスチャーの状態を取得します。
  5. ジェスチャーが開始された場合、startScale 変数に現在のスケールを保存します。
  6. ジェスチャーが更新された場合、scaleFactor 変数にスケールファクタを保存し、scale 変数に新しいスケールを計算します。
  7. 新しいスケールを使用してラベルのスケールを変更します。

実行方法

このコードを実行するには、次の手順を実行します。

  1. Qt Creator を起動します。
  2. 新しい Qt Widgets アプリケーションプロジェクトを作成します。
  3. 上記のコードを main.cpp ファイルに追加します。
  4. プロジェクトをビルドして実行します。
  • このコードはあくまで例であり、ニーズに合わせて変更する必要があります。


ジェスチャーイベントシグナルを使用する

QGesture::state はプロパティであるため、ジェスチャーの状態が変化するたびにポーリングする必要があります。 一方、ジェスチャーイベントシグナルは、ジェスチャーの状態が変化するたびに発生するため、より効率的な方法でジェスチャーの状態を監視できます。

void MyWidget::gestureEvent(QGestureEvent *event) {
  if (event->type() == QEvent::Gesture) {
    QGesture *gesture = event->gesture(Qt::PinchGesture);
    if (gesture) {
      if (gesture->state() == Qt::GestureStarted) {
        // ジェスチャー開始時の処理
      } else if (gesture->state() == Qt::GestureUpdated) {
        // ジェスチャー更新時の処理
      } else if (gesture->state() == Qt::GestureFinished) {
        // ジェスチャー完了時の処理
      } else if (gesture->state() == Qt::GestureCanceled) {
        // ジェスチャーキャンセル時の処理
      }
    }
  }
}

ジェスチャーの開始と終了を検出する

ジェスチャーの開始と終了のみを検出する必要がある場合は、QGesture::state を使用するよりも効率的な方法があります。 例えば、以下のコードでは、ピンチジェスチャーの開始と終了を検出しています。

void MyWidget::gestureEvent(QGestureEvent *event) {
  if (event->type() == QEvent::Gesture) {
    QGesture *gesture = event->gesture(Qt::PinchGesture);
    if (gesture) {
      if (gesture->state() == Qt::GestureStarted) {
        // ジェスチャー開始時の処理
        gesture->setHotSpot(event->pos());
      } else if (gesture->state() == Qt::GestureFinished) {
        // ジェスチャー完了時の処理
        QPointF startPoint = gesture->hotSpot();
        QPointF endPoint = event->pos();

        // スタートポイントとエンドポイントを使用して処理を行う
      }
    }
  }
}

ジェスチャーの更新情報を取得する

ジェスチャーの更新情報を取得する必要がある場合は、QGesture::state を使用するよりも効率的な方法があります。 例えば、以下のコードでは、ピンチジェスチャーのスケールファクタを取得しています。

void MyWidget::gestureEvent(QGestureEvent *event) {
  if (event->type() == QEvent::Gesture) {
    QGesture *gesture = event->gesture(Qt::PinchGesture);
    if (gesture) {
      if (gesture->state() == Qt::GestureUpdated) {
        // スケールファクタを取得する
        qreal scaleFactor = gesture->scaleFactor();

        // スケールファクタを使用して処理を行う
      }
    }
  }
}

カスタムジェスチャーを作成する

必要なジェスチャーが Qt の標準ジェスチャーで提供されていない場合は、カスタムジェスチャーを作成することができます。 カスタムジェスチャーは、QGestureRecognizer クラスを使用して作成できます。