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库来绘制一个子窗口
Forum Updated to NodeBB v4.3 + New Features

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

Scheduled Pinned Locked Moved Unsolved Chinese
quickexternal render外部渲染器paint
2 Posts 2 Posters 3.0k 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