触摸事件未在 QQuickView 上触发

Posted

技术标签:

【中文标题】触摸事件未在 QQuickView 上触发【英文标题】:Touch event not triggered on a QQuickView 【发布时间】:2016-05-31 14:29:35 【问题描述】:

我目前正在为触摸设备实现一个 QML 应用程序,在后台使用 openGL 渲染。我以这次谈话https://www.youtube.com/watch?v=GYa5DLV6ADQ 作为我工作的基础。

简而言之,我正在使用自定义 QQuickView 并将选项“clearbeforerendering”设置为 false,以便能够绘制我的 openGL 内容。除此之外,我想在我的自定义 QQuickView 中接收 touchEvents 来实时修改我的 openGL 渲染。

不幸的是,touchEvent 从未被触发,而我正确接收到不同的 mouseEvents。我在 QOPenGLWindow 上尝试了这段代码并正确接收到了 touchEvents,所以问题不是来自我的设备。

以下是我的代码的一部分,可能会有所帮助:

main.cpp

#include "tableclothwindow.h"
#include "target.h"

int main(int argc, char *argv[])

    QApplication app(argc, argv);
    QDesktopWidget dw;
    TableclothWindow *mainWindow = new TableclothWindow();

    mainWindow->setMinimumSize(QSize(dw.width(),dw.height()));
    mainWindow->setSource(QUrl(QStringLiteral("qrc:/main.qml")));
    mainWindow->show();
    mainWindow->initializeQMLInteraction();

    return app.exec();

main.qml

Item

    id: container
    Text 
        objectName: "text"
        id: helloText
        text: "Hello world!"
        x: 100
        y: 80
        color: "#00FF00"
        opacity: 0.8
        font.pointSize: 24; font.bold: true
        MouseArea
            onClicked: helloText.color = "FF0000"
        
    

tablecloth.cpp(自定义 QQuickView)

#include "tableclothwindow.h"
#include "tableclothscene.h"

TableclothWindow::TableclothWindow(QWindow *parent)
    :QQuickView(parent),
      m_mousePressed(false),
      m_firstTime(true),
      m_targetCentroid(QPointF(0,0)),
      m_scene(new TableclothScene)

    // disable auto-clear for manual openGL rendering
    setClearBeforeRendering(false);
    QObject::connect(this, SIGNAL(beforeRendering()), SLOT(renderOpenGLScene()), Qt::DirectConnection);

    // update visuals
    m_timer = new QTimer(this);
    connect(m_timer, SIGNAL(timeout()), this, SLOT(update()));
    m_timer->start(30);


TableclothWindow::~TableclothWindow()




// openGL rendering functions
void TableclothWindow::renderOpenGLScene()

    if(m_firstTime)
        m_scene->initialize();
        m_scene->resize(width(),height());
        assignLinkedPointMass();
        m_firstTime = false;
    
    m_scene->render();


void TableclothWindow::update()

    if(!m_firstTime)
        updateTargetPosition();
        m_scene->update();
        QQuickView::update();
    


// event handling
// working
void TableclothWindow::mousePressEvent(QMouseEvent *event)

    event->accept();
    qDebug() << "mouse pressed"



// Doesn't work 
void TableclothWindow::touchEvent(QTouchEvent *event)

    event->accept();
    qDebug() << " touch detected";
 

有谁知道为什么在自定义 QQuickView 中不触发 touchEvents ?

【问题讨论】:

【参考方案1】:

经过一些研究,我发现尽管 Qt 文档中有说明,但触摸事件并未在 QQuickView 中分派。

为了解决这个问题,我必须在 QWindow(QQuickView 继承自)QWindow::event(Event*) 的 Qt 事件调度程序中处理 touchEvents。我想您可以自己传播事件或在事件函数中使用它,但我想知道这是错误还是疏忽。

这是我最终得到的代码,我不知道它是否干净,但它可以工作..

    bool TableclothWindow::event(QEvent *event)
    
         event->accept();
         if(event->type() == QEvent::TouchEvent)
             QTouchEvent *touchEvent = static_cast<QTouchEvent*>(event);
             //handling the touchEvent 
         
         return QQuickView::event(event);
     

希望即使这个问题在没有给出任何理由的情况下被否决,它也能对某人有所帮助。

【讨论】:

以上是关于触摸事件未在 QQuickView 上触发的主要内容,如果未能解决你的问题,请参考以下文章

JS触摸事件

html5 touch 触摸事件如何监听一个手指多次来回摩擦触发事件?

javaScript事件事件类型之触摸与手势事件

学习记录 -- 移动端的触摸事件

Javascript 触摸事件没有被触发

移动端js触摸事件大全