使用osgQt源码方式实现osgViewer嵌入Qt窗体

1. 下载osgQt源码

        GitHub - openscenegraph/osgQt

        说明:本示例的osgQt版本下载后的src文件夹下文件列表如下

                

                    include路径下文件列表如下:

                

2. 把osgQt源码文件添加到Qt项目中

        说明:本示例不单独编译osgQt源码,但是把全部osgQt源码以动态库的方式引入项目

                是否全部引入,看自己需求和需求的文件包含关系

        1)创建子项目库

                右键项目 > 新子项目... > 选择 Library > C++ Library   

                本示例此库名命名为 osgQOpenGL(与osgQt库同名)

                

        2)把osgQt源码源文件和头文件以添加现有文件的方式加入到自建的子项目库

                说明:本示例为头文件加上了.hpp后缀名

                添加头文件和源文件之后的子库文件列表如下:

                

3. 解决添加osgQt源码文件后的头文件问题

        说明:头文件找不到,是因为osgQt依赖OSG头文件

        1)新建.pri项目包含文件,在其中引入OSG库和头文件路径包含

                说明:.pri文件名自定,本示例取名为osginclude.pri

                        其中引入文件或文件夹的路径,需要根据自己项目结构而定

                        文末附有本示例项目文件结构截图

                        本示例中.pri文件添加了所有的OSG库(可根据需要添加)

                        OSG库是基于OSG源码使用CMake编译得出,关于库的编译不在此文章讨论

                pri文件内容如下:

                

        2)在子项目库中引入.pri文件

                在子库(osgQOpenGL)的工程文件osgQOpenGL.pro文件中添加引入:

                include($$PWD/../../osginclude.pri)

                说明:$$PWD在Qt的.pro或.pri文件中,指代的是当前.pro或.pri文件所在路径

                        具体路径需要根据自己的项目路径结构引入

                引入.pri文件后,执行pro文件保存(或执行项目qmake),会把pri自动添加到项目结构

                如下:

                

        3)#include <osgQOpenGL/Export> 头文件问题

               说明:此是Qt的多目录编译需要

                使用新建子项目库后自动生成的osgQOpenGL_global.h替换

                如下:

                

                若新建的字库目录名不是osgQOPenGL,则还需要替换

                

4. 编译引入的子项目库

        若成功编译,则需要的osgQt文件引入正确,可进行下一步窗体嵌入

5. 使用osgQt的osgQOpenGLWidget嵌入Qt窗体

         说明:本示例使用 在UI中拖入OpenGL Widget 窗体控件并

                提升为osgQOpenGLWidget的方式嵌入osgview到Qt窗体;

                通过对象组合和控件布局的方式加入到Qt窗体的方式不在此文章讨论

        1)在Qt应用程序的主窗体中拖入OpenGL Widget 窗体控件

                控件如下:

                

        2)提升 OpenGL Widget 窗体控件

                在UI中,右键拖入的窗体控件 > 提升为...  

                把控件提升为 osgQOpenGLWidget

                说明:提升时,需要提升的类的头文件路径根据项目结构而定

                提升后的控件结构如下:

                

        3)在应用的工程文件中引入osgQOpenGL库

                说明:编译需要

                        具体引入路径根据子库生成所在路径而定

                本示例中引入如下:

                

         4)在嵌入的窗体中显示osg模型

                 说明:本示例中,把osgQOpenGLWidget嵌入在Qt主程序窗体

                创建槽函数,连接osgQOpenGLWidget初始化的信号

                

                说明:若执行窗体最大化等操作,需在信号槽连接之后,如上图

                        执行窗体最大化,osgQOpenGLWidget即会发送初始化信号,

                        从而导致信号槽连接失败

                槽函数中获取osgViewer::Viewer* 执行添加模型等操作

                 

        5)备注:项目效果见文章 封面&摘要

6. 项目程序运行环境配置

        以上编码完成后,在Qt中直接运行程序,会直接崩掉,且无提示

        原因是缺少依赖库

        需要在程序的可执行文件路径 添加OSG库和Qt动态库及Qt的平台库

        本示例程序和子库生成存放路径已在工程文件(项目.pro文件)中配置(见 7.附录)

        本机添加osg库和Qt库及Qt平台插件的截图如下(下图未展示全部):

                

        具体缺少什么库,双击生成的可执行程序,会有相应提示

        依赖Qt的动态库在Qt的安装路径下可以找到 

        本机路径如下:

                

         本机platforms平台插件获取路径如下(Qt安装路径下):

                

7. 附录

        本示例项目文件结构

        

        项目结构

        

        关于项目生成的程序和生成的子库存放位置的配置

        在主程序.pro和子库的pro中添加配置如下:

        

 

        

 

 

 

 

 

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OSG开发,有时候需要将OSG的场景嵌入QT应用程序。常见的做法是使用osgQt库来实现这一功能,但是有时候也可以不使用osgQt重写类来嵌入QT应用程序。 在不使用osgQt的情况下,我们可以通过以下几个步骤来实现OSG场景的嵌入。 首先,需要在QT应用程序创建一个QOpenGLWidget控件,用于显示OSG场景。接着,我们需要创建一个OSG的GraphicsWindowOpenGL对象,将其与QOpenGLWidget控件进行绑定。 然后,我们需要创建一个OSG的Camera对象,并将其设置为主相机。同时,我们需要创建一个OSGViewer对象,将之前创建的GraphicsWindowOpenGL对象作为参数传入。 接着,我们可以开始创建场景,并将其添加到Viewer对象。 在QT应用程序,我们可以通过重写QOpenGLWidget的resizeGL()函数和paintGL()函数来设置场景的大小和绘制场景。 最后,我们需要在QT应用程序启动一个定时器,不断更新和绘制场景。可以通过调用Viewer对象的frame()函数来实现。 通过以上的步骤,我们可以实现QT应用程序嵌入OSG场景的效果,而不使用osgQt库。 不使用osgQt重写类嵌入QT应用程序的好处是简化了开发过程,并且提供了更多灵活性。我们可以更加自由地控制场景的绘制和更新,以及与其他QT控件的交互。 当然,osgQt库也提供了更多的功能和封装,适用于更复杂的场景嵌入需求。在选择是否使用osgQt时,可以根据具体的开发需求和项目要求进行取舍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值