Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Chinese
  4. 在quick桌面程序,如何使用外部gl库来绘制一个子窗口
Qt 6.11 is out! See what's new in the release blog

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

Scheduled Pinned Locked Moved Unsolved Chinese
quickexternal render外部渲染器paint
2 Posts 2 Posters 3.5k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Offline
    A Offline
    Angelking
    wrote on last edited by joeQ
    #1

    在做工具的时候,需要用到外部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来绘制子窗口(比如编辑器中游戏引擎的场景)?

    jiancaiyangJ 1 Reply Last reply
    1
    • A Angelking

      在做工具的时候,需要用到外部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来绘制子窗口(比如编辑器中游戏引擎的场景)?

      jiancaiyangJ Offline
      jiancaiyangJ Offline
      jiancaiyang
      wrote on last edited by
      #2

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

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

      我们自己的论坛:http://qtdream.com
      擅长三维角色仿真动画。

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved