Qt GUIでマウス、タッチ、ペンを区別する方法:QPointerEvent::pointerType()徹底解説


QPointerEvent::pointerType() 関数は、ポインターイベントが生成されたポインターの種類を取得するために使用されます。これは、マウス、タッチスクリーン、ペンなどの様々なポインティングデバイスを区別するために役立ちます。

戻り値

この関数は、QPointingDevice::PointerType 型の値を返します。この型は、以下のいずれかの定数を取ることができます。

  • PointerType::Stylus: スタイラスポインター
  • PointerType::Pen: ペンポインター
  • PointerType::Touch: タッチスクリーンポインター
  • PointerType::Mouse: マウスポインター
  • PointerType::Unknown: ポインターの種類が不明な場合
QPointerEvent *event = ...;
QPointingDevice::PointerType pointerType = event->pointerType();

if (pointerType == QPointingDevice::PointerType::Mouse) {
    // マウスイベントを処理する
} else if (pointerType == QPointingDevice::PointerType::Touch) {
    // タッチイベントを処理する
} else {
    // その他のタイプのポインターイベントを処理する
}
  • QPointerEvent::points() 関数は、イベント内のすべてのポインターの位置を取得するために使用できます。
  • QPointerEvent::point() 関数は、指定されたインデックスのポインターの位置を取得するために使用できます。
  • QPointerEvent::pointCount() 関数は、イベント内のポインターの数を取得するために使用できます。


#include <QApplication>
#include <QWidget>

class MyWidget : public QWidget
{
public:
    MyWidget()
    {
        setMouseTracking(true);
    }

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        if (event->pointerType() == QPointingDevice::PointerType::Mouse) {
            qDebug() << "マウスでクリックされました";
        } else if (event->pointerType() == QPointingDevice::PointerType::Touch) {
            qDebug() << "タッチスクリーンでクリックされました";
        } else {
            qDebug() << "ペンまたはスタイラスでクリックされました";
        }
    }
};

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

このコードでは、MyWidget クラスが作成されています。このクラスは、mousePressEvent() メソッドをオーバーライドして、マウス、タッチスクリーン、ペンによるクリックイベントを処理します。

mousePressEvent() メソッドは、QPointerEvent::pointerType() 関数を使用して、イベントが生成されたポインターの種類を取得します。この情報を使用して、イベントの種類に応じた処理を行います。

このコードは、QPointerEvent::pointerType() 関数の使用方法を示す簡単な例です。この関数は、様々なポインティングデバイスを区別するために役立つ強力なツールです。

以下の例では、QPointerEvent::pointCount() 関数と QPointerEvent::point() 関数を使用して、イベント内のすべてのポインターの位置を取得する方法を示しています。

#include <QApplication>
#include <QWidget>

class MyWidget : public QWidget
{
public:
    MyWidget()
    {
        setMouseTracking(true);
    }

protected:
    void mousePressEvent(QMouseEvent *event) override
    {
        int count = event->pointCount();
        for (int i = 0; i < count; ++i) {
            QPoint point = event->point(i);
            qDebug() << "ポインター " << i + 1 << " の位置: " << point;
        }
    }
};

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

このコードは、マルチタッチイベントを処理する方法を示しています。マルチタッチイベントでは、複数のポインターが同時に画面に触れることができます。

このコードは、QPointerEvent::pointCount() 関数を使用して、イベント内のポインターの数を取得します。次に、QPointerEvent::point() 関数を使用して、各ポインターの位置を取得します。



source() メソッドの使用

QPointerEvent::source() メソッドは、イベントを生成したデバイスを取得します。このデバイスは、QInputDevice クラスの派生クラスのインスタンスになります。

QPointerEvent *event = ...;
QInputDevice *device = event->source();

if (device->isTouchDevice()) {
    // タッチスクリーンイベントを処理する
} else if (device->isMouse()) {
    // マウスイベントを処理する
} else {
    // その他のタイプのポインターイベントを処理する
}

identifier() メソッドの使用

QPointerEvent::identifier() メソッドは、イベントを生成したポインターの一意の識別子を取得します。この識別子は、イベントが生成されたデバイスと、そのデバイス上のどのポインターによって生成されたかを区別するために使用できます。

QPointerEvent *event = ...;
int identifier = event->identifier();

if (identifier == 0) {
    // メインポインターによるイベント
} else {
    // 追加のポインターによるイベント
}

touchPoint() メソッドの使用

QPointerEvent::touchPoint() メソッドは、タッチスクリーンイベントの場合に、タッチポイントに関する情報を含む QTouchEvent オブジェクトを返します。このオブジェクトを使用して、タッチポイントの位置、圧力、IDなどの情報にアクセスできます。

QPointerEvent *event = ...;
QTouchEvent touchEvent = event->touchPoint();

if (touchEvent.isValid()) {
    // タッチポイントに関する情報にアクセスする
}

tabletEvent() メソッドの使用

QPointerEvent::tabletEvent() メソッドは、ペンイベントの場合に、ペンイベントに関する情報を含む QTabletEvent オブジェクトを返します。このオブジェクトを使用して、ペンの位置、圧力、傾きなどの情報にアクセスできます。

QPointerEvent *event = ...;
QTabletEvent tabletEvent = event->tabletEvent();

if (tabletEvent.isValid()) {
    // ペンイベントに関する情報にアクセスする
}

どの方法を使用すべきか

使用する方法は、特定の状況によって異なります。

  • マルチタッチイベントを処理する場合は、identifier() メソッドを使用します。
  • イベントの種類をすばやく簡単に判断したい場合は、QPointerEvent::pointerType() 関数を使用するのが最善です。
  • 以前のバージョンの Qt では、これらのメソッドがすべて利用できない場合があります。
  • 上記の方法は、Qt 6 以降で使用できます。