【初心者向け】Qt GUIでタッチスクリーンイベントを処理する方法:QEventPoint::uniqueIdをわかりやすく解説


QEventPoint::uniqueId は、Qt GUIにおけるタッチスクリーンイベントの識別に使用されるプロパティです。これは、タッチスクリーン上の個々のタッチポイントを区別するために使用されるユニークなIDを提供します。

詳細

QEventPoint::uniqueId は、QPointingDeviceUniqueId 型の値を返します。この型は、タッチスクリーンデバイスによって生成される一意のIDを表します。ただし、すべてのタッチスクリーンデバイスがユニークなIDを生成できるわけではないことに注意する必要があります。一部のデバイスでは、複数のタッチポイントに同じIDを割り当てる場合があります。

QEventPoint::uniqueId は、タッチスクリーンイベントを処理する際に、個々のタッチポイントを追跡するために役立ちます。たとえば、マルチタッチジェスチャを検出したり、特定のタッチポイントに関連するイベントのみを処理したりするために使用できます。

次のコードは、タッチスクリーンイベントの QEventPoint::uniqueId を取得する方法を示しています。

QEventPoint eventPoint = ...;
QPointingDeviceUniqueId uniqueId = eventPoint.uniqueId();

このコードは、eventPoint オブジェクトに関連付けられているタッチポイントのユニークなIDを uniqueId 変数に格納します。

  • QEventPoint::uniqueId は、常に有効であるとは限りません。一部のデバイスでは、IDが再利用される可能性があります。
  • QEventPoint::uniqueId は、タッチスクリーンデバイスによって生成されるIDであることに注意してください。Qt 自体によって生成されるIDではありません。


void MyWidget::touchEvent(QTouchEvent *event)
{
    for (const QTouchPoint &touchPoint : event->touchPoints()) {
        QPointingDeviceUniqueId uniqueId = touchPoint.uniqueId();
        qDebug() << "Touch point ID:" << uniqueId;
    }
}

例2:特定のタッチポイントに関連するイベントのみを処理する

この例では、特定のタッチポイントIDを持つタッチポイントに関連するイベントのみを処理します。

QPointingDeviceUniqueId targetId = 12345; // ターゲットID

void MyWidget::touchEvent(QTouchEvent *event)
{
    for (const QTouchPoint &touchPoint : event->touchPoints()) {
        QPointingDeviceUniqueId uniqueId = touchPoint.uniqueId();

        if (uniqueId == targetId) {
            // ターゲットIDを持つタッチポイントが検出された場合の処理
            qDebug() << "Target touch point detected! ID:" << uniqueId;
        }
    }
}

例3:マルチタッチジェスチャを検出する

この例では、2本の指で画面をタップするマルチタッチジェスチャを検出します。

void MyWidget::touchEvent(QTouchEvent *event)
{
    if (event->touchPointCount() == 2) {
        const QTouchPoint &touchPoint1 = event->touchPoints()[0];
        const QTouchPoint &touchPoint2 = event->touchPoints()[1];

        QPointingDeviceUniqueId id1 = touchPoint1.uniqueId();
        QPointingDeviceUniqueId id2 = touchPoint2.uniqueId();

        if (id1 != id2) {
            // 2本の指で画面をタップした場合は、マルチタッチジェスチャを検出
            qDebug() << "Multi-touch gesture detected!";
        }
    }
}


タッチポイントのインデックス

各タッチポイントは、QTouchEvent オブジェクト内の touchPoints() メソッドによって返されるリストにインデックス番号を持っています。このインデックス番号を使用して、タッチポイントを識別することができます。

長所

  • 常に有効
  • シンプルで理解しやすい

短所

  • マルチタッチジェスチャの検出には不向き
  • 複数のタッチポイントが同時に存在する場合、インデックス番号が混同される可能性がある

void MyWidget::touchEvent(QTouchEvent *event)
{
    for (int i = 0; i < event->touchPointCount(); ++i) {
        const QTouchPoint &touchPoint = event->touchPoints()[i];
        // タッチポイントの処理
    }
}

タッチポイントの位置

タッチポイントの位置は、QPoint 型の値を使用して表すことができます。この位置情報を使用して、タッチポイントを識別することができます。

長所

  • 複数のタッチポイントが同時に存在する場合でも、個々のタッチポイントを区別できる
  • マルチタッチジェスチャの検出に適している

短所

  • タッチポイントのIDよりも処理負荷が高い
  • 複数のタッチポイントが重なり合っている場合、位置情報だけでは区別できない可能性がある

void MyWidget::touchEvent(QTouchEvent *event)
{
    for (const QTouchPoint &touchPoint : event->touchPoints()) {
        QPoint position = touchPoint.pos();
        // タッチポイントの処理
    }
}

独自のIDの割り当て

独自のIDをタッチポイントに割り当てることもできます。これは、QPointingDeviceUniqueId 型の値を使用して行うことができます。

長所

  • 複雑なマルチタッチジェスチャの検出に適している
  • 常にユニークなIDを保証できる

短所

  • メモリ使用量が増加する
  • コードが複雑になる

void MyWidget::touchEvent(QTouchEvent *event)
{
    for (const QTouchPoint &touchPoint : event->touchPoints()) {
        QPointingDeviceUniqueId uniqueId = generateUniqueId(); // 独自のIDを生成する
        // タッチポイントにIDを割り当てる
        touchPoint.setUniqueId(uniqueId);
        // タッチポイントの処理
    }
}

QPointingDeviceUniqueId MyWidget::generateUniqueId()
{
    // 独自のID生成ロジック
}

最適な方法の選択

使用する方法は、アプリケーションの要件によって異なります。

  • 常にユニークなIDを保証する必要がある場合は、独自のIDを割り当てます。
  • マルチタッチジェスチャの検出が必要な場合は、タッチポイントの位置を使用します。
  • シンプルで理解しやすい方法が必要な場合は、タッチポイントのインデックスを使用します。

上記以外にも、タッチスクリーンイベントの識別に以下の方法を使用することができます。

  • タッチスクリーンデバイスによって生成されるタイムスタンプ
  • タッチスクリーンデバイスによって生成されるシリアル番号