在quick桌面程序,如何使用外部gl库来绘制一个子窗口



  • 在做工具的时候,需要用到外部gl库来绘制工具中的子窗口,而不再使用Qt自带的gl层。对于widget开发就很容易,我只需要继承widget,在子类中重写

    void paintEvent(QPaintEvent *e) override; QPaintEngine *paintEngine() const override;
    

    这两个函数,然后在UI编辑器中就可以将这个子类当作widget来添加,之后获取winId(),就可以将其winId()交给外部gl库来绘制这个widget对应的子窗口。这时外部的渲染库其实也可以是DirectX 9等,所需要的就是一个窗口的句柄。

    但是现在我使用quick框架,据我的了解,顶层窗口是qquickwindow子类,里面的任何可见都是qquickitem子类,当我继承QQuickItem,并重写

    QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override;
    

    之后,发现通过获取其window()->winId(),最终使用外部gl在进行像素格式设置SetPixelFormat的时候会失败,提示不可用的像素格式,而使用widget框架就没有任何问题,请问有哪位对quick的绘制及窗口非常了解的大牛,怎么使用quik框架,由外部gl来绘制子窗口(比如编辑器中游戏引擎的场景)?



  • @Angelking 恰好我也在做这方面的研究。
    我的需求是,为我们的动作编辑器增添Direct3D的支持,因为用户更加习惯MME----这是一个基于HLSL的渲染框架。
    这里问题在于我们使用的是Qt Quick,而现有的代码是和OpenGL深度绑定的,我们需要做的是考察哪些地方和OpenGL深度绑定的,然后尝试抽象出来,做好做成一个插件,我是考察Qt插件的写法决定将OpenGL相关的内容放在插件里实现。

    想让Qt Quick应用和OpenGL和Direct3D解耦,我想一个方法就是使用RTT技术。就是采用不同的渲染器在一个纹理图上渲染,这样有可能通用。但是其中的难点感觉还是挺多的,现在在艰难地攻克。



Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.