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();
}
説明
このコードは次のように動作します。
MyWidget
コンストラクタで、ピンチジェスチャー認識器を登録します。gestureEvent()
メソッドは、ジェスチャーイベントを処理します。- ジェスチャーイベントのタイプが
QEvent::Gesture
である場合、event->gesture()
メソッドを使用してジェスチャーを取得します。 - ジェスチャーがピンチジェスチャーである場合、
gesture->state()
メソッドを使用してジェスチャーの状態を取得します。 - ジェスチャーが開始された場合、
startScale
変数に現在のスケールを保存します。 - ジェスチャーが更新された場合、
scaleFactor
変数にスケールファクタを保存し、scale
変数に新しいスケールを計算します。 - 新しいスケールを使用してラベルのスケールを変更します。
実行方法
このコードを実行するには、次の手順を実行します。
- Qt Creator を起動します。
- 新しい Qt Widgets アプリケーションプロジェクトを作成します。
- 上記のコードを
main.cpp
ファイルに追加します。 - プロジェクトをビルドして実行します。
- このコードはあくまで例であり、ニーズに合わせて変更する必要があります。
ジェスチャーイベントシグナルを使用する
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 クラスを使用して作成できます。