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

1. 下载osgQt源码

        GitHub - openscenegraph/osgQt

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第1张图片

                    include路径下文件列表如下:

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第2张图片

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

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

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

        1)创建子项目库

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

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第3张图片

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

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

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第4张图片

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

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

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

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

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

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

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

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

                pri文件内容如下:

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第5张图片

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

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

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

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

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

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

                如下:

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第6张图片

        3)#include  头文件问题

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

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

                如下:

                

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第7张图片

4. 编译引入的子项目库

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

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

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

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

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

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

                控件如下:

                

        2)提升 OpenGL Widget 窗体控件

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

                把控件提升为 osgQOpenGLWidget

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

                提升后的控件结构如下:

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第8张图片

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

                说明:编译需要

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

                本示例中引入如下:

                

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

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

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第9张图片

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

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

                        从而导致信号槽连接失败

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第10张图片 

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

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

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

        原因是缺少依赖库

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

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

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第11张图片

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

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

        本机路径如下:

                

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

                使用osgQt源码方式实现osgViewer嵌入Qt窗体_第12张图片

7. 附录

        本示例项目文件结构

        使用osgQt源码方式实现osgViewer嵌入Qt窗体_第13张图片

        项目结构

        使用osgQt源码方式实现osgViewer嵌入Qt窗体_第14张图片

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

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

        使用osgQt源码方式实现osgViewer嵌入Qt窗体_第15张图片

 

        

 

 

 

 

 

 

你可能感兴趣的:(qt,开发语言,gnu,osg)