最近在做一个基于安卓平台的opengl项目,在这里采用的是 QQuickFramebufferObject::Renderer作为QML与Opengl沟通的桥梁,但是现在遇到了一个问题,我应该如何将qml的事件传递给我的opengl呢?
2条回答 默认 最新
西北一哥 2023-04-17 13:27关注在上面的示例代码中,我们在synchronize方法中获取QML的MouseEvent并将其保存到成员变量m_mouseEvent中。在render方法中,我们使用保存的m_mouseEvent进行渲染。请注意,为了确保m_mouseEvent保存了最新的QML事件,我们在beforeSynchronizing信号中获取它,并在render方法中使用它。
1.创建一个继承自QQuickFramebufferObject的类,用于创建QML中显示OpenGL的对象,同时继承自QQuickItem,使其成为可交互的QML控件。```c++ class MyOpenGLWidget : public QQuickFramebufferObject, public QQuickItem { public: MyOpenGLWidget(QQuickItem *parent = nullptr); QQuickFramebufferObject::Renderer* createRenderer() const override; };2.创建一个继承自QQuickFramebufferObject::Renderer的类,用于实现OpenGL的渲染逻辑。class MyOpenGLRenderer : public QQuickFramebufferObject::Renderer { public: MyOpenGLRenderer(); // 实现 synchronize() 方法,用于获取 QML 事件 void synchronize(QQuickFramebufferObject *item) override; // 实现 render() 方法,用于渲染 OpenGL 场景 void render() override; private: QMouseEvent *m_lastMouseEvent = nullptr; };3.在MyOpenGLWidget类中实现createRenderer()方法,返回我们创建的MyOpenGLRenderer对象。 ```c++ QQuickFramebufferObject::Renderer *MyOpenGLWidget::createRenderer() const { return new MyOpenGLRenderer(); }4.在MyOpenGLRenderer类中实现synchronize()方法,获取QML事件并保存在成员变量m_lastMouseEvent中。
```c++ void MyOpenGLRenderer::synchronize(QQuickFramebufferObject *item) { QQuickWindow *window = item->window(); if (window) { QObject::connect(window, &QQuickWindow::beforeSynchronizing, this, [window, this]() { foreach (QEvent *event, window->polish()) { if (event->type() == QEvent::MouseButtonPress) { m_lastMouseEvent = static_cast<QMouseEvent*>(event); break; } } }); } }5.在MyOpenGLRenderer类中实现render()方法,根据m_lastMouseEvent来渲染OpenGL场景。void MyOpenGLRenderer::render() { if (m_lastMouseEvent) { // 根据m_lastMouseEvent来渲染OpenGL场景 // ... } }```
现在,您可以将MyOpenGLWidget对象作为一个QML控件添加到您的QML界面中,并在其中显示OpenGL场景。QML中的MouseEvent会在MyOpenGLRenderer中被捕获并传递给OpenGL进行渲染。解决 无用评论 打赏 举报