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
说明:此是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中添加配置如下: