遇到一个项目需要做模型单体化,通过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,理解不深刻,还恳请各位看官斧正!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)