• osg嵌入到Qt窗体,实现Qt和osg混合编程


    目录

    1. 前提

    2. 配置

    3. 一个Qt实现的osg例子 


    1. 前提

         已经完成osg在Visual Studio上的64位编译生成编译包,现在尝试把osg嵌入qt中,实现交互。

    2. 配置

        首先在vs下生成一个新的项目:

     

    然后对Osg的vs项目属性进行配置(Tip:在此之前一定记得电脑的环境变量中一定要先配好,因为是基于已经完成编译了这里就不讲怎么配了网上很多大概是如下):

    Visual Studio属性配置,属性页配置:

     链接器中,附加依赖项加入osg的lib(Debug所以后面有d,Release没有)

    3. 一个Qt实现的osg例子 

    里面直接粘贴:

    1. OpenThreadsd.lib
    2. osgd.lib
    3. osgDBd.lib
    4. osgFXd.lib
    5. osgGAd.lib
    6. osgManipulatord.lib
    7. osgParticled.lib
    8. osgShadowd.lib
    9. osgSimd.lib
    10. osgTerraind.lib
    11. osgTextd.lib
    12. osgUtild.lib
    13. osgViewerd.lib

    至此配置完成现在来把Osg嵌入qt中
    新建一个普通视图类QtOsgView用于控制QT中OSG的渲染,和一些基本响应,代码如下
    QtOsgView.cpp

    1. #include "QtOsgView.h"
    2. #include
    3. AdapterWidget::AdapterWidget(QWidget *parent, const char* name, const QGLWidget * shareWidget, Qt::WindowFlags f)
    4. {
    5. mGw = new osgViewer::GraphicsWindowEmbedded(0, 0, width(), height());//创建可移植的窗口。
    6. setFocusPolicy(Qt::ClickFocus);
    7. }
    8. void AdapterWidget::resizeGL(int width, int height)
    9. {
    10. //mGw->getEventQueue()->windowResize(0, 0, width, height);
    11. mGw->getEventQueue()->windowResize(0, 0, width, height);
    12. mGw->resized(0, 0, width, height);
    13. }
    14. void AdapterWidget::keyPressEvent(QKeyEvent* event)
    15. {
    16. mGw->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol) *(event->text().toUtf8().data()));
    17. }
    18. void AdapterWidget::keyReleaseEvent(QKeyEvent* event)
    19. {
    20. mGw->getEventQueue()->keyRelease((osgGA::GUIEventAdapter::KeySymbol)*(event->text().toUtf8().data()));
    21. }
    22. void AdapterWidget::mousePressEvent(QMouseEvent* event)
    23. {
    24. int button = 0;
    25. switch (event->button())
    26. {
    27. case(Qt::LeftButton):
    28. button = 1;
    29. break;
    30. case (Qt::MidButton):
    31. button = 2;
    32. break;
    33. case (Qt::RightButton):
    34. button = 3;
    35. break;
    36. case (Qt::NoButton):
    37. button = 0;
    38. break;
    39. default:
    40. button = 0;
    41. break;
    42. }
    43. mGw->getEventQueue()->mouseButtonPress(event->x(), event->y(), button);
    44. }
    45. void AdapterWidget::mouseReleaseEvent(QMouseEvent* event)
    46. {
    47. int button = 0;
    48. switch (event->button())
    49. {
    50. case(Qt::LeftButton):
    51. button = 1;
    52. break;
    53. case(Qt::MidButton):
    54. button = 2;
    55. break;
    56. case(Qt::RightButton):
    57. button = 3;
    58. break;
    59. case(Qt::NoButton):
    60. button = 0;
    61. break;
    62. default:
    63. button = 0;
    64. break;
    65. }
    66. mGw->getEventQueue()->mouseButtonRelease(event->x(), event->y(), button);
    67. }
    68. void AdapterWidget::mouseMoveEvent(QMouseEvent* event)
    69. {
    70. mGw->getEventQueue()->mouseMotion(event->x(), event->y());
    71. }
    72. void AdapterWidget::wheelEvent(QWheelEvent* event)
    73. {
    74. mGw->getEventQueue()->mouseScroll(event->delta() > 0 ? osgGA::GUIEventAdapter::SCROLL_UP : osgGA::GUIEventAdapter::SCROLL_DOWN);
    75. }
    76. QtOsgView::QtOsgView(QWidget * parent, const char * name, const QGLWidget * shareWidget, Qt::WindowFlags f) :AdapterWidget(parent, name, shareWidget, f)
    77. {
    78. getCamera()->setViewport(new osg::Viewport(0, 0, width(), height()));
    79. getCamera()->setProjectionMatrixAsPerspective(30.0f, static_cast<double>(width()) / static_cast<double>(height()), 1.0f, 10000.0f);
    80. getCamera()->setGraphicsContext(getGraphicsWindow());
    81. setThreadingModel(osgViewer::Viewer::SingleThreaded);
    82. mStrTime = 0.0;
    83. mEndTime = 0.0;
    84. mSleepTime = 0.0;
    85. num = 0;
    86. }
    87. void QtOsgView::paintGL()
    88. {
    89. mStrTime = mTimer.tick();
    90. frame();
    91. num++;
    92. mEndTime = mTimer.tick();
    93. //计算需要睡眠的时间
    94. mSleepTime = 1.0 / 60.0 - mTimer.delta_s(mStrTime, mEndTime);
    95. if (mSleepTime < 0)
    96. {
    97. mSleepTime = 0.0;
    98. }
    99. //睡眠
    100. OpenThreads::Thread::microSleep(mSleepTime * 1000000); //微秒
    101. Sleep(mSleepTime * 1000); //毫秒
    102. double mTime = mTimer.tick();
    103. //qDebug() << "帧数:" << mTimer.delta_s(mStrTime, mTime);
    104. //递归调用
    105. update();
    106. }

    QtOsgView.h

    1. #ifndef QTOSGVIEW_H
    2. #define QTOSGVIEW_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. class AdapterWidget :public QOpenGLWidget
    16. {
    17. public:
    18. AdapterWidget(QWidget *parent = 0, const char* name = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);
    19. virtual ~AdapterWidget() {}
    20. osgViewer::GraphicsWindow* getGraphicsWindow()
    21. {
    22. return mGw.get();
    23. }
    24. const osgViewer::GraphicsWindow* getGraphicsWidow()const
    25. {
    26. return mGw.get();
    27. }
    28. protected:
    29. virtual void resizeGL(int width, int height);
    30. virtual void keyPressEvent(QKeyEvent* event);
    31. virtual void keyReleaseEvent(QKeyEvent* event);
    32. virtual void mousePressEvent(QMouseEvent* event);
    33. virtual void mouseReleaseEvent(QMouseEvent* event);
    34. virtual void mouseMoveEvent(QMouseEvent* event);
    35. virtual void wheelEvent(QWheelEvent* event);
    36. osg::ref_ptr mGw;
    37. };
    38. class QtOsgView : public osgViewer::Viewer, public AdapterWidget
    39. {
    40. public:
    41. QtOsgView(QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0);
    42. ~QtOsgView() {}
    43. virtual void paintGL();
    44. protected:
    45. osg::Timer mTimer; //定时器,控制帧速
    46. double mStrTime; //开始tick时间
    47. double mEndTime; //结束tick时间
    48. double mSleepTime; //需要睡眠的时间
    49. int num;
    50. };
    51. #endif // QTOSGWIDGET_H

    下一步就是提升为的操作(这里我想的是把QT的窗口提升为之前我们定义的普通类窗口QtOsgView实现osg的窗口化)

    在新建Widget上右击空白处选择提升窗口部件,手动输入类名称和头文件 

    这样我们的WIdget就能够在qt中显示出来了下面只需要在我们的osg_qt类中把自己的代码写入即可
    下面贴上我自己的代码
    osg_qt.h

    1. #include
    2. #include
    3. #include "ui_osg_qt.h"
    4. class osg_qt :public QMainWindow
    5. {
    6. Q_OBJECT
    7. public:
    8. osg_qt(QWidget *parent = 0);
    9. private:
    10. Ui::osg_qtClass ui;
    11. };

     osg_qt.cpp

    1. #include "osg_qt.h"
    2. osg_qt::osg_qt(QWidget *parent)
    3. : QMainWindow(parent)
    4. {
    5. ui.setupUi(this);
    6. QMainWindow* mw = new QMainWindow(this);
    7. mw->setWindowFlags(Qt::Widget);
    8. osg::ref_ptr root = new osg::Group;
    9. osg::ref_ptrcar = new osg::Node();
    10. osgDB::Options *funa = new osgDB::Options(std::string("noTriStripPolygons"));
    11. car = osgDB::readNodeFile("min_stl.STL", funa);//这里需要自己加入文件
    12. root->addChild(car.get());
    13. ui.osg_widget = new QtOsgView(mw);
    14. ui.osg_widget->setCameraManipulator(new osgGA::TrackballManipulator);
    15. ui.osg_widget->addEventHandler(new osgViewer::WindowSizeHandler);
    16. ui.osg_widget->addEventHandler(new osgViewer::StatsHandler);
    17. ui.osg_widget->setSceneData(root.get());
    18. mw->setCentralWidget(ui.osg_widget);
    19. this->setCentralWidget(mw);
    20. }

    运行一下就可以啦

    本文转自:OSG嵌入QT配置_osg+qt-CSDN博客 

    另外下面这篇博文也是osg和Qt交互的:

    VS下OSG嵌入QT指定窗口

  • 相关阅读:
    Python+Pycharm如何安装第三方库及为何pip安装的包在Pycharm中不能使用的解决方式
    [BJDCTF2020]EzPHP
    易观千帆 | 2022年10月银行APP月活跃用户规模盘点
    k8s编程operator——client-go基础部分
    Python---多线程
    java并发数据结构之CopyOnWriteArrayList
    测试进阶知识之零日攻击的发现和防御
    在 Windows 终端运行已有的 Python 程序
    Java虚拟机之运行时数据区(一)
    【JVM】jvm的类加载机制
  • 原文地址:https://blog.csdn.net/danshiming/article/details/133876014