Qt GUI でネイティブジェスチャを自在に操る!QNativeGestureEvent::gestureType() の詳細解説


QNativeGestureEvent::gestureType() は、Qt GUIにおけるネイティブジェスチャイベントの種類を取得するための関数です。ネイティブジェスチャイベントは、オペレーティングシステムによって生成されるジェスチャイベントであり、ピンチ、ズーム、回転などの操作を表します。

機能

gestureType() 関数は、Qt::NativeGestureType 型の値を返します。この型は、以下のジェスチャの種類を表す列挙体です。

  • Qt::SwipeNativeGesture: スワイプジェスチャを示します。
  • Qt::RotateNativeGesture: 回転ジェスチャを示します。
  • Qt::PanNativeGesture: パンジェスチャを示します。
  • Qt::SmartZoomNativeGesture: スマートズームジェスチャを示します。
  • Qt::ZoomNativeGesture: ピンチまたはズームジェスチャを示します。
  • Qt::EndNativeGesture: ジェスチャの終了を示します。
  • Qt::BeginNativeGesture: ジェスチャの開始を示します。

void MyWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        lastPos = event->pos();
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() == Qt::LeftButton) {
        QNativeGestureEvent *gestureEvent = new QNativeGestureEvent(Qt::PanNativeGesture, event->localPos(), event->windowPos(), event->screenPos());
        gestureEvent->setLastPos(lastPos);
        lastPos = event->pos();
        QApplication::sendEvent(this, gestureEvent);
    }
}

この例では、マウスの左ボタンが押されたときに lastPos 変数に現在のマウス位置を保存し、マウスが移動したときに QNativeGestureEvent オブジェクトを作成してアプリケーションに送信しています。QNativeGestureEvent オブジェクトには、ジェスチャの種類、現在のマウス位置、前回のマウス位置などの情報が含まれています。

  • ジェスチャの種類によっては、value() 関数を使用して追加情報を得ることができます。例えば、Qt::ZoomNativeGesture ジェスチャの場合は、スケールファクターの差分が返されます。
  • gestureType() 関数は、ジェスチャの開始と終了イベントでは常に Qt::BeginNativeGesture または Qt::EndNativeGesture を返します。


#include <QApplication>
#include <QWidget>
#include <QNativeGestureEvent>

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

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
};

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
}

void MyWidget::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        lastPos = event->pos();
    }
}

void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
    if (event->buttons() == Qt::LeftButton) {
        QNativeGestureEvent *gestureEvent = new QNativeGestureEvent(Qt::PanNativeGesture, event->localPos(), event->windowPos(), event->screenPos());
        gestureEvent->setLastPos(lastPos);
        lastPos = event->pos();
        QApplication::sendEvent(this, gestureEvent);
    }
}

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MyWidget widget;
    widget.show();
    return app.exec();
}

このコードでは、以下の処理が行われます。

  1. MyWidget クラスを定義します。このクラスは QWidget を継承しており、マウスイベントを処理するメソッドを実装しています。
  2. mousePressEvent() メソッドは、マウスの左ボタンが押されたときに lastPos 変数に現在のマウス位置を保存します。
  3. mouseMoveEvent() メソッドは、マウスが移動したときに QNativeGestureEvent オブジェクトを作成してアプリケーションに送信します。
  4. QNativeGestureEvent オブジェクトには、ジェスチャの種類、現在のマウス位置、前回のマウス位置などの情報が含まれています。
  5. main() 関数は、アプリケーションを起動し、MyWidget ウィジェットを表示します。


代替方法

  • Qt::GestureType を使用する

QNativeGestureEvent クラスは、Qt::GestureType 型の gestureType() プロパティも提供しています。このプロパティは、Qt GUI フレームワークによって定義されたジェスチャの種類を表します。

Qt::GestureType gestureType = event->gestureType();

switch (gestureType) {
    case Qt::SwipeGesture:
        // スワイプジェスチャを処理する
        break;
    case Qt::PinchGesture:
        // ピンチジェスチャを処理する
        break;
    case Qt::TapGesture:
        // タップジェスチャを処理する
        break;
    default:
        break;
}

この方法の利点は、Qt::GestureType 型が Qt GUI フレームワーク固有のジェスチャの種類を表しているため、コードがより分かりやすくなることです。

  • ジェスチャイベントのサブクラスを使用する

QNativeGestureEvent クラスには、様々なジェスチャの種類を表すサブクラスが用意されています。例えば、QPanNativeGestureEvent はパンジェスチャを表すサブクラスです。

QPanNativeGestureEvent *panGestureEvent = dynamic_cast<QPanNativeGestureEvent *>(event);
if (panGestureEvent) {
    // パンジェスチャを処理する
}

この方法の利点は、ジェスチャの種類に特化したメソッドを使用できるため、コードがより読みやすくなることです。

  • プラットフォーム固有の API を使用する

オペレーティングシステムによっては、ネイティブジェスチャイベントを処理するためのプラットフォーム固有の API が提供されています。

この方法の利点は、プラットフォーム固有のジェスチャ機能にアクセスできることです。

最適な方法

最適な方法は、状況によって異なります。一般的には、以下のガイドラインに従うことをお勧めします。

  • プラットフォーム固有のジェスチャ機能が必要な場合は、プラットフォーム固有の API を使用する。
  • より複雑なジェスチャ処理の場合は、ジェスチャイベントのサブクラスを使用する。
  • シンプルなジェスチャ処理の場合は、Qt::GestureType を使用する。