在VS2015中将OSG嵌套在Qt中(简版)

遇到一个项目需要做模型单体化,通过osg,并利用Qt做一个界面,但是由于之前实在是没有接触过这方面的内容,一切都需要从头来过,之前的环境配置在网上也是找了很多教程,踩了很多坑,好在通过一段时间完成了,现在想实现一个简单的功能,就是把osg放在Qt界面内展示。查找了许多资料,查的也不太齐全,有些我自己也运行不出来,就找了一个自己能实现的,在这儿里给大家贴一下。

1.新建Qt项目

完成创建后,右击项目->属性

在VC++目录中(此处可以添加osg和Qt相关所有库)

在包含目录内添加include文件路径;

在库目录内添加lib文件路径;

在C/C++内,点击预处理器,添加预处理器定义:WIN32

在链接器内,点击输入->附加依赖项,添加附加依赖文件,我添加的如下所示:


OpenThreadsd.lib
osgd.lib
osgDBd.lib
osgFXd.lib
osgGAd.lib
osgManipulatord.lib
osgParticled.lib
osgShadowd.lib
osgSimd.lib
osgTerraind.lib
osgTextd.lib
osgUtild.lib
osgViewerd.lib
Qt5Cored.lib
Qt5Guid.lib
Qt5Widgetsd.lib
Qt5OpenGLd.lib
osgQOpenGLd.lib

最后点击应用,然后确定,基本的环境就算搭建完毕。

可以点击开始执行(不调试)运行一下看看效果。得到的结果应该是一个空白的widget页面。

2.ViewerWidget.h

#pragma once

#include <QtWidgets/QWidget>
#include "ui_ViewerWidget.h"

#include<QWidget>
#include <QPushButton>
#include <osgQOpenGL/osgQOpenGLWidget>
class ViewerWidget : public QWidget
{
	Q_OBJECT

public:
	ViewerWidget(QWidget *parent = Q_NULLPTR);

	osgQOpenGLWidget *pOsgW;
private:
	Ui::ViewerWidgetClass ui;

private slots:
	void initOsg();
};

3.ViewerWdiget.cpp

#include "ViewerWidget.h"
#include <osgQOpenGL/osgQOpenGLWidget>
#include <QBoxLayout>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgUtil/Optimizer>
#include <osgGA/TrackballManipulator>
#include <osgViewer/ViewerEventHandlers>
#include <osgGA/StateSetManipulator>
#pragma execution_character_set("utf-8")
ViewerWidget::ViewerWidget(QWidget *parent)
    : QWidget(parent)
{
    ui.setupUi(this);
	resize(800, 600);

	QHBoxLayout *pLayout = new QHBoxLayout(this);
	pLayout->setMargin(0);

	pOsgW = new osgQOpenGLWidget;
	pOsgW->setFixedSize(400, 300);
	pLayout->addWidget(pOsgW);
	connect(pOsgW, SIGNAL(initialized()), this, SLOT(initOsg()));
}

void ViewerWidget::initOsg()
{
	osgViewer::Viewer *pViewer = ((osgQOpenGLWidget *)sender())->getOsgViewer();
	pViewer->setCameraManipulator(new osgGA::TrackballManipulator());
	osg::Node *pNode = osgDB::readNodeFile("glider.osg");

	osgUtil::Optimizer optimizer;
	optimizer.optimize(pNode);
	pViewer->setSceneData(pNode);
}

其中

#pragma execution_character_set("utf-8")的作用是使得系统中所有中文编码均使用utf-8

不过我在这儿给demo里暂时没用到

这里的思路大概是:添加QHBoxLayout布局,在布局内添加osgQOpenGLWidget,如果其完成初始化,则触发信号initOsg方法,显示osg内容。

4.main.cpp

在main.cpp函数内其实就多增加了一行代码

QApplication::setAttribute(Qt::AA_DisableShaderDiskCache);

一开始在没添加这行代码之前,直接调试会出现exe停止运行的报错,一开始我找了好多,说什么指针的问题或者内存溢出等等,后来我尝试加了一下这行代码,成功了,我就不得不重新思考一下这行代码的作用

我搜了一下,大概意思是禁用着色器磁盘缓存

QApplication负责管理GUI程序的控制流和主要设置。其包含窗口系统和其他来源处理过和发送过的主要事件循环。它也处理应用程序的初始化和首位工作,并提供对话管理。QApplication可以对系统和应用的大部分设置项进行设置。

对于Qt写的任何GUI应用,不管这个应用有多少个窗口,有且仅有一个QApplication对象;

对于Qt写的非GUI应用,有且只有一个QCoreApplication对象,并且这个应用不依赖QtGUI库。

 

 

 最终的运行结果如下图所示:

 小滑翔机起飞咯

由于本人知识水平也有限,很多东西也在借鉴copy,理解不深刻,还恳请各位看官斧正!

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值