时月oe 2023-04-17 13:10 采纳率: 44.4%
浏览 21

opengl与render的关联问题

最近在做一个基于安卓平台的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进行渲染。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月17日

悬赏问题

  • ¥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命令做一个通话软件,播放录音