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 の出力は、次のシーケンス操作のための別の情報です。
- 最初の指をタッチスクリーンに置く
- 2 番目の指をタッチ スクリーンに置きます。最初の指のタッチは無効になり、今のところ重要ではありません。
- 2 本目の指を離します。コンソールは ---onCanceled---... を出力しますが、最初の指のタッチはまだ無効で、touch1.pressed は false です。
QQuickView を使用すると、この奇妙な動作は発生しません。
Qt のドキュメントでは、キャンセルされたシグナルについて、「このシグナルは、別のアイテムがタッチ イベント処理を盗んだため、新しいタッチ イベントがキャンセルされたときに発行されます」と述べています。
検索後のドキュメントの意味がわかりません。
画面にタッチすると何が起こるかを理解するためにソース コードを読み込もうとしましたが、QQuickWidget::event() がタッチ イベント (TouchBegin...) を QQuickWindow に送信し、QQuickView::event = QQuickWindow が再実装されなかったのが好きです。 .
では、Qt のドキュメントの本当の意味は何でしょうか?
QQuickView ではなく QQuickWidget が必要なので、QQuickWidget で MultiPointTouchArea を使用して、正しい動作を期待するにはどうすればよいですか?