OSG和Qt结合
来源:互联网 发布:银行程序员招聘要求 编辑:程序博客网 时间:2024/06/05 09:46
简述
想使用Qt做界面开发,OSG做三维图形开发,由于Qt支持OpenGL,而OSG也是由OpenGL作为底层库开发的,所以OSG也能嵌入到Qt中。
程序基于osg3.4和Qt5.5,并且对帧率进行了控制。
实现
QtOsgView.h
#ifndef QTOSGVIEW_H#define QTOSGVIEW_H#include <osgViewer/Viewer>#include <osgViewer/CompositeViewer>#include <osgViewer/ViewerEventHandlers>#include <osgGA/TrackballManipulator>#include <osgDB/ReadFile>#include <QString>#include <QKeyEvent>#include <QMouseEvent>#include <QWheelEvent>#include <QOpenGLWidget>#include <QMainWindow>#include <iostream>class AdapterWidget :public QOpenGLWidget{public:AdapterWidget(QWidget *parent = 0, const char* name = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);virtual ~AdapterWidget(){}osgViewer::GraphicsWindow* getGraphicsWindow(){return mGw.get();}const osgViewer::GraphicsWindow* getGraphicsWidow()const{return mGw.get();}protected:virtual void resizeGL(int width, int height);virtual void keyPressEvent(QKeyEvent* event);virtual void keyReleaseEvent(QKeyEvent* event);virtual void mousePressEvent(QMouseEvent* event);virtual void mouseReleaseEvent(QMouseEvent* event);virtual void mouseMoveEvent(QMouseEvent* event);virtual void wheelEvent(QWheelEvent* event);osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> mGw;};class QtOsgView : public osgViewer::Viewer, public AdapterWidget{public:QtOsgView(QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);~QtOsgView(){}virtual void paintGL();protected:osg::Timer mTimer;//定时器,控制帧速double mStrTime;//开始tick时间double mEndTime;//结束tick时间double mSleepTime;//需要睡眠的时间int num;};#endif // QTOSGWIDGET_H
QtOsgView.cpp
#include "QtOsgView.h"AdapterWidget::AdapterWidget(QWidget *parent, const char* name, const QGLWidget * shareWidget, Qt::WindowFlags f){mGw = new osgViewer::GraphicsWindowEmbedded(0, 0, width(), height());setFocusPolicy(Qt::ClickFocus);}void AdapterWidget::resizeGL(int width, int height){mGw->getEventQueue()->windowResize(0, 0, width, height);mGw->resized(0, 0, width, height);}void AdapterWidget::keyPressEvent(QKeyEvent* event){mGw->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol) *(event->text().toUtf8().data()));}void AdapterWidget::keyReleaseEvent(QKeyEvent* event){mGw->getEventQueue()->keyRelease((osgGA::GUIEventAdapter::KeySymbol)*(event->text().toUtf8().data()));}void AdapterWidget::mousePressEvent(QMouseEvent* event){int button = 0;switch (event->button()){case(Qt::LeftButton) :button = 1;break;case (Qt::MidButton) :button = 2;break;case (Qt::RightButton) :button = 3;break;case (Qt::NoButton) :button = 0;break;default:button = 0;break;}mGw->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);}void AdapterWidget::mouseReleaseEvent(QMouseEvent* event){int button = 0;switch (event->button()){case(Qt::LeftButton) :button = 1;break;case(Qt::MidButton) :button = 2;break;case(Qt::RightButton) :button = 3;break;case(Qt::NoButton) :button = 0;break;default:button = 0;break;}mGw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);}void AdapterWidget::mouseMoveEvent(QMouseEvent* event){mGw->getEventQueue()->mouseMotion(event->x(), event->y());}void AdapterWidget::wheelEvent(QWheelEvent* event){mGw->getEventQueue()->mouseScroll(event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_UP : osgGA::GUIEventAdapter::SCROLL_DOWN);}QtOsgView::QtOsgView(QWidget * parent, const char * name, const QGLWidget * shareWidget, Qt::WindowFlags f) :AdapterWidget(parent, name, shareWidget, f){getCamera()->setViewport(new osg::Viewport(0, 0, width(), height()));getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width()) / static_cast<double>(height()), 1.0f, 10000.0f);getCamera()->setGraphicsContext(getGraphicsWindow());setThreadingModel(osgViewer::Viewer::SingleThreaded);mStrTime = 0.0;mEndTime = 0.0;mSleepTime = 0.0;num = 0;}void QtOsgView::paintGL(){mStrTime = mTimer.tick();frame();num++;mEndTime = mTimer.tick();//计算需要睡眠的时间mSleepTime = 1.0 / 60.0 - mTimer.delta_s(mStrTime, mEndTime);if (mSleepTime < 0){mSleepTime = 0.0;}//睡眠OpenThreads::Thread::microSleep(mSleepTime * 1000000);//微秒//Sleep(mSleepTime * 1000);//毫秒double mTime = mTimer.tick();std::cout << "帧数:" << mTimer.delta_s(mStrTime, mTime) << std::endl;//递归调用update();}
osgqt.h
#ifndef OSGQT_H#define OSGQT_H#include <QtWidgets/QWidget>class osgQt : public QWidget{Q_OBJECTpublic:osgQt(QWidget *parent = 0);~osgQt();private:Ui::osgQtClass ui;};#endif // OSGQT_H
osgqt.cpp
#include "osgqt.h"#include "QtOsgView.h"#include <QHBoxLayout>osgQt::osgQt(QWidget *parent): QWidget(parent){QHBoxLayout *layout = new QHBoxLayout;this->setLayout(layout);QMainWindow* mw = new QMainWindow(this);layout->addWidget(mw);mw->setWindowFlags(Qt::Widget);osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("glider.osg");QtOsgView * ViewerWindow = new QtOsgView(mw);ViewerWindow->setCameraManipulator(new osgGA::TrackballManipulator);ViewerWindow->addEventHandler(new osgViewer::WindowSizeHandler);ViewerWindow->addEventHandler(new osgViewer::StatsHandler);ViewerWindow->setSceneData(loadedModel.get());mw->setCentralWidget(ViewerWindow);}osgQt::~osgQt(){}
main.cpp
#include "osgqt.h"#include <QtWidgets/QApplication>#include "QtOsgView.h"#if 1int main(int argc, char *argv[]){QApplication a(argc, argv);osgQt w;w.show();return a.exec();}#endif
阅读全文
1 0
- OSG和Qt结合
- osg和QT结合出现的问题
- OSG 与QT 结合
- OSG 与QT 结合
- osg与qt结合
- osg与Qt结合编程
- OSG与Qt结合--成功使用QTabWidget
- osg和Qt结合,记录一下环境搭建,测试及遇到的问题
- OSG与CEGUI结合
- OSG与CEGUI结合
- Opencascade与OSG结合
- Qt中嵌入OSG
- qt osg 多点触摸
- ODE 与 OSG 的结合
- osg::ArgumentParser和osg::ApplicationUsage
- osg::MatrixTransform和osg::Matrix
- osg::ArgumentParser和osg::ApplicationUsage
- osg::MatrixTransform和osg::Matrix
- jar包和war包的介绍和区别
- 软件架构资源汇总
- Julia: 关于下载库时WinRPM的Bug
- 从grub2启动windows
- 【Java】-- 方法的重写和重载
- OSG和Qt结合
- mysql之 共享表空间与独立表空间、frm,MYD,MYI.idb,par文件说明
- 【Android学习笔记系列】AsyncTask、BaseAdapter整合异步加载用例(通过解析JSON格式数据加载网络图片内容)
- POI shiftRows后合并单元格丢失的解决办法
- selenium通过add_cookie()添加cookie
- EcmaScript 6 箭头函数
- Broadcast的简单封装
- 解决:CentOS下MySQL执行select ... into outfile ...: Can't create/write to file '...' (Errcode: 13)
- 又是线段树,看来还得温习