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?