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

在VS2015中将OSG嵌套在Qt中(简版),第1张

遇到一个项目需要做模型单体化,通过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 
#include "ui_ViewerWidget.h"

#include
#include 
#include 
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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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,理解不深刻,还恳请各位看官斧正!

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/568387.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存