2015-04-05 26 views
0

我试图让MultiPointTouchArea在QQuickWidget中正常工作。请看下面的例子QML文件(MultiPointTouchTest.qml):QQuickWidget中的MultiPointTouchArea行为

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. 把我的第二根手指触摸屏;第一次手指触摸变得无效,现在不重要。
  3. 删除我的第二根手指;控制台打印--- onCanceled ---...,第一根手指触摸仍然无效,touch1.pressed为false。

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

Qt的文件说取消的信号,“当新的触摸事件已被取消,因为另一个项目偷走触摸事件处理时发出此信号。”

搜索后我不知道文档的意思。我尝试阅读源代码,以了解当我触摸屏幕时发生了什么,但我喜欢QQuickWidget :: event()发送触摸事件(TouchBegin ...)到QQuickWindow,并且QQuickView :: event = QQuickWindow ,没有重新实现。

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

我需要QQuickWidget而不是QQuickView,那么我怎样才能用QQuickWidget使用MultiPointTouchArea并且具有正确的预期行为?

+1

你的问题是什么? – folibis 2015-04-05 09:24:16

+0

抱歉:)我想让QQuickWidget像QQuickView一样工作,就像我说的那样,作为我的问题,当我的第二根手指从屏幕上移开时,第一根手指的移动是无效的。但QQuickWidget不起作用QQuickView(QQuickView工作完美。 – Player 2015-04-05 09:35:17

回答

1

我也有类似的问题,并发现设置

quickWidget->setAttribute(Qt::WA_AcceptTouchEvents) 

解决它。