最近在做一个基于安卓平台的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进行渲染。解决 无用评论 打赏 举报
悬赏问题
- ¥15 c++ gmssl sm2验签demo
- ¥15 关于模的完全剩余系(关键词-数学方法)
- ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
- ¥15 关于移动机器人坐标计算
- ¥30 模拟电路 logisim
- ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
- ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
- ¥15 安装quartus II18.1时弹出此error,怎么解决?
- ¥15 keil官网下载psn序列号在哪
- ¥15 想用adb命令做一个通话软件,播放录音