QQuickWidget 中的 MultiPointTouchArea 行为
Posted
技术标签:
【中文标题】QQuickWidget 中的 MultiPointTouchArea 行为【英文标题】:MultiPointTouchArea behaviour in QQuickWidget 【发布时间】:2015-04-05 08:48:13 【问题描述】:我正在尝试让 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 的打印是不同的信息,用于跟随顺序操作:
-
将我的第一根手指放在触摸屏上
将我的第二根手指放在触摸屏上;第一次手指触摸无效,暂时不重要。
移开我的第二根手指;控制台打印 ---onCanceled---...,第一根手指触摸仍然无效,并且 touch1.pressed 为假。
使用 QQuickView 不会发生这种奇怪的行为。
Qt 的文档对取消信号说,“当新的触摸事件被取消时发出此信号,因为另一个项目窃取了触摸事件处理。”
我不知道搜索后文档的意思。
我尝试阅读源代码以了解当我触摸屏幕时会发生什么, 但我喜欢 QQuickWidget::event() 发送触摸事件(TouchBegin...) 到 QQuickWindow,而 QQuickView::event = QQuickWindow,没有重新实现。
那么,Qt 文档的真正含义是什么?
我需要 QQuickWidget 而不是 QQuickView,如何将 MultiPointTouchArea 与 QQuickWidget 一起使用并获得正确的预期行为?
【问题讨论】:
你有什么问题? sorry:) 我想让 MultiPointTouchArea 像 QQuickView 一样在 QQuickWidget 中工作,就像我说的,作为我的问题,当我的第二根手指从屏幕上移开时,第一根手指的移动无效。但 QQuickWidget 不能作为 QQuickView 工作(QQuickView 工作完美。 【参考方案1】:我有类似的问题,发现设置
quickWidget->setAttribute(Qt::WA_AcceptTouchEvents)
解决了。
【讨论】:
【参考方案2】:Main.cpp
QQuickWidget *content = new QQuickWidget(QUrl("qrc:/myPopup.qml"));
content->setAttribute(Qt::WA_TranslucentBackground);
content->setClearColor(Qt::transparent);
content->setAttribute(Qt::WA_AcceptTouchEvents);
scene.addWidget(content);
myPopup.qml
import QtQuick 2.13
import QtQuick.Controls 2.13
Rectangle
id:itemParent
width: 90; height: 90
color: "red"
MultiPointTouchArea
anchors.fill: parent
minimumTouchPoints: 1
maximumTouchPoints: 2
touchPoints: [
TouchPoint id: touch1; objectName: "touch 1";
]
onPressed:
console.log(touch1.objectName, "pressed:", touch1.pressed, touch1.x, touch1.y);
onReleased:
console.log(touch1.objectName, "onReleased:", touch1.pressed, touch1.x, touch1.y);
onTouchUpdated:
console.log(touch1.objectName, "onTouchUpdated:", touch1.pressed, touch1.x, touch1.y);
即使我添加了 content->setAttribute(Qt::WA_AcceptTouchEvents),它也会检测到鼠标而不是触摸。
【讨论】:
以上是关于QQuickWidget 中的 MultiPointTouchArea 行为的主要内容,如果未能解决你的问题,请参考以下文章