2016-05-31 4 views
0

Ich implementiere derzeit eine QML-Anwendung für ein Touch-Gerät mit OpenGL-Rendering im Hintergrund. Ich benutzte dieses Gespräch https://www.youtube.com/watch?v=GYa5DLV6ADQ als Basis für meine Arbeit.Berührungsereignis nicht ausgelöst auf einer QQuickView

Kurz gesagt, ich benutze ein benutzerdefiniertes QQuickView und setze die Option "clearbeforerdering" auf false, um meinen openGL-Inhalt zeichnen zu können. Außerdem möchte ich in meiner benutzerdefinierten QQuickView touchEvents erhalten, um mein OpenGL-Rendering in Echtzeit zu ändern.

Nicht entfernt, TouchEvent wird nie ausgelöst, während ich die verschiedenen mouseEvents korrekt erhalte. Ich habe diesen Code in einem QOPenGLWindow ausprobiert und die touchEvents korrekt empfangen, so dass das Problem nicht von meinem Gerät kommt.

Hier sind einige Teil meines Codes, die hilfreich sein könnten:

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 (custom 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"; 
} 

Tut a Weiß jemand, warum die TouchEvents nicht in der benutzerdefinierten QQuickView ausgelöst werden?

Antwort

1

Nach einigen Recherchen fand ich heraus, dass die touchEvents trotz der in der Qt-Dokumentation enthaltenen Angaben nicht in QQuickView versandt wurden.

Um das Problem zu lösen, musste ich die TouchEvents im Qt Event Dispatcher des QWindow (aus dem QQuickView erben) QWindow :: event (Event *) behandeln. Ich schätze, Sie können das Ereignis selbst propagieren oder es so verwenden, wie es in der Ereignisfunktion ist, aber ich frage mich, ob es ein Fehler oder ein Versehen ist. Hier

ist der Code, den ich es endete mit, ich weiß nicht, ob es sauber ist, aber es funktioniert ..

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); 
    } 

Hoffe, dass es jemand helfen könnte, auch wenn die Frage gewesen niedergestimmt mit nicht Grund gegeben.

Verwandte Themen