0

MultiPointTouchArea を QQuickWidget 内で正しく動作させようとしています。次の例の qml ファイル (MultiPointTouchTest.qml) を考えてみましょう。

import QtQuick 2.0

Rectangle {
    width: 360
    height: 480
    color: touch1.pressed ? "gray" : "black";

    MultiPointTouchArea {
        anchors.fill: parent
        minimumTouchPoints: 1
        maximumTouchPoints: 2
        enabled: true;
        touchPoints: [
            TouchPoint { id: touch1; objectName: "touch 1"; },
            TouchPoint { id: touch2; objectName: "touch 2"; }
        ]

        onGestureStarted: {
            gesture.grab();
        }
        onPressed: {
            console.log("---onPressed---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
        onUpdated: {
            console.log("---onUpdated---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
        onReleased: {
            console.log("---onReleased---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
        onTouchUpdated: {
            console.log("---onTouchUpdated---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
            console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
    onCanceled: {
            console.log("---onCanceled---");
            console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
        console.log(touch2.objectName, "pressed:", touch2.pressed, touch2.x, touch2.y);
        }
    }
}

main.cpp ファイルでは、次のように QQuickWidget または QQuickView を使用します。

QQuickWidget* quickWidget = new QQuickWidget(QUrl("qrc:///QML/qml/MultiPointTouchTest.qml"));
if (quickWidget->status() == QQuickWidget::Ready) {
    QQuickItem* quickItem = quickWidget->rootObject();
    quickItem->setProperty("width", QApplication::desktop()->width());
    quickItem->setProperty("height", QApplication::desktop()->height());
    quickWidget->resize(QApplication::desktop()->width(), QApplication::desktop()->height());
}

また

QQuickView* quickView = new QQuickView(QUrl("qrc:///QML/qml/MultiPointTouchTest.qml"));
... // like QQuickWidget's code

MultiPointTouchArea の出力は、次のシーケンス操作のための別の情報です。

  1. 最初の指をタッチスクリーンに置く
  2. 2 番目の指をタッチ スクリーンに置きます。最初の指のタッチは無効になり、今のところ重要ではありません。
  3. 2 本目の指を離します。コンソールは ---onCanceled---... を出力しますが、最初の指のタッチはまだ無効で、touch1.pressed は false です。

QQuickView を使用すると、この奇妙な動作は発生しません。

Qt のドキュメントでは、キャンセルされたシグナルについて、「このシグナルは、別のアイテムがタッチ イベント処理を盗んだため、新しいタッチ イベントがキャンセルされたときに発行されます」と述べています。

検索後のドキュメントの意味がわかりません。

画面にタッチすると何が起こるかを理解するためにソース コードを読み込もうとしましたが、QQuickWidget::event() がタッチ イベント (TouchBegin...) を QQuickWindow に送信し、QQuickView::event = QQuickWindow が再実装されなかったのが好きです。 .

では、Qt のドキュメントの本当の意味は何でしょうか?

QQuickView ではなく QQuickWidget が必要なので、QQuickWidget で MultiPointTouchArea を使用して、正しい動作を期待するにはどうすればよいですか?

4

2 に答える 2

1

同様の問題があり、その設定が見つかりました

quickWidget->setAttribute(Qt::WA_AcceptTouchEvents)

解決しました。

于 2015-07-20T12:13:27.180 に答える