Qt GUI プログラミングのワンポイントアドバイス:QPointingDevice::pointerType() を活用して直感的な操作を実現


QPointingDevice::pointerType() メソッドは、ポインティングデバイスの種類を返します。ポインティングデバイスとは、マウス、タッチスクリーン、ペンなどの入力デバイスを指します。このメソッドは、アプリケーションがポインティングデバイスの種類に応じて異なる動作を行う場合に役立ちます。

戻り値

このメソッドは、QPointingDevice::PointerType 型の値を返します。この型は、以下のいずれかの値になります。

  • Pen: ペンです。
  • Touch: タッチスクリーンです。
  • Mouse: マウスです。
  • Unknown: デバイスの種類が不明です。

以下のコードは、QPointingDevice::pointerType() メソッドを使用して、ポインティングデバイスの種類に応じて異なるメッセージを出力します。

QPointingDevice *device = QInputDevice::mouse();

if (device->pointerType() == QPointingDevice::Mouse) {
    qDebug() << "マウスが使用されました";
} else if (device->pointerType() == QPointingDevice::Touch) {
    qDebug() << "タッチスクリーンが使用されました";
} else if (device->pointerType() == QPointingDevice::Pen) {
    qDebug() << "ペンが使用されました";
} else {
    qDebug() << "不明なポインティングデバイスが使用されました";
}


void handlePointerEvent(QPointingDevice *device, QPoint pos) {
    if (device->pointerType() == QPointingDevice::Mouse) {
        qDebug() << "マウス (" << pos.x() << "," << pos.y() << ") が使用されました";
    } else if (device->pointerType() == QPointingDevice::Touch) {
        qDebug() << "タッチスクリーン (" << pos.x() << "," << pos.y() << ") が使用されました";
    } else if (device->pointerType() == QPointingDevice::Pen) {
        qDebug() << "ペン (" << pos.x() << "," << pos.y() << ") が使用されました";
    } else {
        qDebug() << "不明なポインティングデバイス (" << pos.x() << "," << pos.y() << ") が使用されました";
    }
}

このコードでは、handlePointerEvent() 関数が呼び出されるたびに、ポインティングデバイスの種類とカーソルの位置がログに出力されます。この関数は、QMouseEvent または QTouchEvent オブジェクトから呼び出すことができます。

マウスボタンのクリックを区別する

以下のコードは、マウスの左ボタン、中ボタン、右ボタンがクリックされたかどうかを判断します。

void handleMouseEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
        qDebug() << "左ボタンがクリックされました";
    } else if (event->button() == Qt::MiddleButton) {
        qDebug() << "中ボタンがクリックされました";
    } else if (event->button() == Qt::RightButton) {
        qDebug() << "右ボタンがクリックされました";
    }
}

このコードでは、handleMouseEvent() 関数が呼び出されるたびに、クリックされたマウスボタンがログに出力されます。この関数は、QMouseEvent オブジェクトから呼び出すことができます。

タッチスクリーンのジェスチャーを区別する

以下のコードは、タッチスクリーンのタップ、スワイプ、ピンチなどのジェスチャーを判断します。

void handleTouchEvent(QTouchEvent *event) {
    if (event->type() == QEvent::TouchBegin) {
        qDebug() << "タッチ開始";
    } else if (event->type() == QEvent::TouchMove) {
        qDebug() << "タッチ移動";
    } else if (event->type() == QEvent::TouchEnd) {
        qDebug() << "タッチ終了";
    } else if (event->type() == QEvent::PinchGesture) {
        qDebug() << "ピンチジェスチャー";
    } else if (event->type() == QEvent::SwipeGesture) {
        qDebug() << "スワイプジェスチャー";
    }
}

このコードでは、handleTouchEvent() 関数が呼び出されるたびに、タッチスクリーンジェスチャーの種類がログに出力されます。この関数は、QTouchEvent オブジェクトから呼び出すことができます。

ペン情報の取得

以下のコードは、ペンの圧力、傾き、方位などの情報を取得します。

void handlePenEvent(QTabletEvent *event) {
    qDebug() << "圧力:" << event->pressure();
    qDebug() << "傾き:" << event->tiltAngle();
    qDebug() << "方位:" << event->orientation();
}


QEvent::type()` メソッド

QEvent::type() メソッドは、イベントの種類を返します。この情報を使用して、ポインティングデバイスの種類を判断することができます。例えば、QMouseEvent の場合はマウス、QTouchEvent の場合はタッチスクリーン、QTabletEvent の場合はペンであることがわかります。

void handleEvent(QEvent *event) {
    if (event->type() == QEvent::Type::MouseButtonPress) {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
        if (mouseEvent->button() == Qt::LeftButton) {
            qDebug() << "左ボタンがクリックされました";
        }
    } else if (event->type() == QEvent::Type::TouchBegin) {
        qDebug() << "タッチ開始";
    } else if (event->type() == QEvent::Type::TabletPress) {
        qDebug() << "ペンが押されました";
    }
}

QInputContext::inputMethod()` メソッド

QInputContext::inputMethod() メソッドは、現在の入力メソッドを返します。この情報を使用して、ポインティングデバイスの種類を推測することができます。例えば、ソフトウェアキーボードが使用されている場合は、タッチスクリーンまたはペンである可能性が高いです。

QInputContext *context = QInputContext::current();
if (context && context->inputMethod()->property(QInputMethod::Property::HardwareInputEnabled).toBool()) {
    qDebug() << "ハードウェア入力デバイスが使用されています";
} else {
    qDebug() << "ソフトウェア入力デバイスが使用されています";
}

プラットフォーム固有の API

プラットフォームによっては、ポインティングデバイスの種類を判断するためのより詳細な API が提供されている場合があります。例えば、Windows では GetPointerDeviceProperties() 関数、macOS では CGEventGetDevice() 関数を使用することができます。

ヒューリスティック

状況によっては、ヒューリスティックを使用してポインティングデバイスの種類を推測することができます。例えば、カーソルが速く移動している場合は、タッチスクリーンまたはペンである可能性が高いです。

どの方法を選択するべきか

どの方法を選択するかは、状況によって異なります。一般的には、QEvent::type() メソッドが最もシンプルで汎用性の高い方法です。しかし、より詳細な情報が必要な場合は、他の方法を使用する必要があるかもしれません。

  • プラットフォーム固有の API を使用する場合、その API がすべてのプラットフォームでサポートされていることを確認する必要があります。
  • QPointingDevice::pointerType() メソッドは、ポインティングデバイスの現在の状態のみを返します。デバイスの種類が変更される可能性があることに注意してください。