我目前正在为后台开放式渲染的触控设备实施QML应用程序。我用这个话题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?
答案 0 :(得分:1)
经过一些研究后,我发现尽管在Qt文档中有所说明,但touchEvents并未在QQuickView中发送。
为了解决这个问题,我必须处理QWindow(QQuickView继承自QW事件调度程序)QWindow :: event(Event *)的Qt事件调度程序中的touchEvents。我想你可以自己传播这个事件,或者在事件函数中使用它,但我想知道这是一个bug还是一个疏忽。
以下是我最终完成的代码,我不知道它是否干净但是有效..
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);
}
希望它可能对某人有所帮助,即使这个问题在没有理由的情况下被投了票。