首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiPointTouchArea在QQuickWidget中的行为

MultiPointTouchArea在QQuickWidget中的行为
EN

Stack Overflow用户
提问于 2015-04-05 08:48:13
回答 2查看 1.3K关注 0票数 0

我试图让MultiPointTouchArea在QQuickWidget中正确工作。考虑下面的qml文件示例(MultiPointTouchTest.qml):

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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());
}

代码语言:javascript
复制
QQuickView* quickView = new QQuickView(QUrl("qrc:///QML/qml/MultiPointTouchTest.qml"));
... // like QQuickWidget's code

MultiPointTouchArea的打印是不同的信息,用于以下顺序操作:

  1. 把我的食指放到触摸屏上
  2. 把我的第二个手指放在触摸屏上;第一个手指的触摸变得无效,暂时不重要。
  3. 移除我的第二指;控制台的指纹--onCanceled-.,食指触摸仍然无效,而按下的1是假的。

使用QQuickView,这种奇怪的行为不会发生。

Qt的文档说,对于已取消的信号,“当新的触摸事件被取消时会发出这个信号,因为另一个项目窃取了触摸事件处理。”

我不知道文件在搜查后的意思。

我试着阅读源代码来理解触摸屏时会发生什么,但我喜欢QQuickWidget::event()发送触摸事件(TouchBegin.)QQuickWindow和QQuickView::Event= QQuickWindow没有重新实现。

那么,Qt文档的真正含义是什么?

我需要的是QQuickWidget而不是QQuickView,那么,如何在QQuickWidget中使用MultiPointTouchArea并具有正确的预期行为呢?

EN

回答 2

Stack Overflow用户

发布于 2015-07-20 12:13:27

我也有过类似的问题,我发现

代码语言:javascript
复制
quickWidget->setAttribute(Qt::WA_AcceptTouchEvents)

解决了它。

票数 1
EN

Stack Overflow用户

发布于 2020-03-16 11:06:36

Main.cpp

代码语言:javascript
复制
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

代码语言:javascript
复制
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),,它也可以检测鼠标而不是触摸。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29455602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档