我试图让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 codeMultiPointTouchArea的打印是不同的信息,用于以下顺序操作:
使用QQuickView,这种奇怪的行为不会发生。
Qt的文档说,对于已取消的信号,“当新的触摸事件被取消时会发出这个信号,因为另一个项目窃取了触摸事件处理。”
我不知道文件在搜查后的意思。
我试着阅读源代码来理解触摸屏时会发生什么,但我喜欢QQuickWidget::event()发送触摸事件(TouchBegin.)QQuickWindow和QQuickView::Event= QQuickWindow没有重新实现。
那么,Qt文档的真正含义是什么?
我需要的是QQuickWidget而不是QQuickView,那么,如何在QQuickWidget中使用MultiPointTouchArea并具有正确的预期行为呢?
发布于 2015-07-20 12:13:27
我也有过类似的问题,我发现
quickWidget->setAttribute(Qt::WA_AcceptTouchEvents)解决了它。
发布于 2020-03-16 11:06:36
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),,它也可以检测鼠标而不是触摸。
https://stackoverflow.com/questions/29455602
复制相似问题