经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Windows » 查看文章
Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo
来源:cnblogs  作者:长沙红胖子Qt  时间:2024/7/29 10:44:02  对本文有异议

前言

Open CASCADE是由Open Cascade SAS公司开发和支持的开源软件开发平台,旨在为特定领域快速开发程序而设计。它是一个面向对象的C++类库,提供了丰富的几何造型、数据交换和可视化等功能,成为许多CAD软件的核心组件。
??本篇描述搭建Qt开发occ环境过程。

 

Demo

注意:用的是内部QWidget提升为OccWidget,边框都是9px默认。
??在这里插入图片描述

 

编译器版本问题

由于使用得occ的7.7,本身是msvc2015x64版本,所以Qt使用5.9.3的msvc2015x64版本(上一篇写成了msvc2017x64)。
??在这里插入图片描述

 

搭建Qt开发环境

步骤一:新建demo,模块化思路

 在这里插入图片描述

在这里插入图片描述
??在这里插入图片描述

步骤二:将occ的sdk模块化

这里本来打算将所有的三方库都放到一个bin、lib和include下混合,让pro里面要写xcopy脚本,后来发现不是很好,只好单独保持原样。
??下面开始拷贝,将所有文件夹里面的bin里面的拷贝到模块的bin下,lib和include都做此操作,这里单个文件夹下都有bin、lib和include,只有occ没有。

draco-1.4.1-vc14-64:拷贝bin、include、lib

在这里插入图片描述

ffmpeg-3.3.4-64:拷贝bin、include、lib

在这里插入图片描述

freeimage-3.17.0-vc14-64:拷贝bin、include、lib

在这里插入图片描述

freetype-2.5.5-vc14-64:拷贝bin、include、lib

在这里插入图片描述

opencascade-7.7.0:拷贝inc和win64

inc中是头文件, win64中有bin和lib,保持相对原路径,已防止后续跟踪目录一致。
??在这里插入图片描述

在这里插入图片描述

openvr-1.14.15-64:拷贝bin、include、lib

在这里插入图片描述

qt5.11.2-vc14-64:不拷贝,我们是Qt5.9.3 msvc2017x64(就是vc14-64)

rapidjson-1.1.0:拷贝include

这个比较特殊,源文件就在头文件里面,不是生成库。
??在这里插入图片描述

tbb_2021.5-vc14-64:拷贝bin、include、lib

在这里插入图片描述

tcltk-86-64:拷贝bin、include、lib

在这里插入图片描述

vtk-6.1.0-vc14-64:拷贝bin、include、lib

在这里插入图片描述

步骤三:配置pri引入库

这里要引入头文件路径,库文件路径和库文件:
occManager.pri

  1. INCLUDEPATH += $$PWD
  2. DEPENDPATH += $$PWD
  3. HEADERS += $$PWD/OccManager.h
  4. SOURCES += $$PWD/OccManager.cpp
  5. # occ-7.7.0-msvc2015x64(openCascade-7.7.0-vc14-64)
  6. INCLUDEPATH += $$PWD/occ-7.7.0-msvc2015x64/opencascade-7.7.0/inc
  7. LIBS += -L$$PWD/occ-7.7.0-msvc2015x64/opencascade-7.7.0/win64/vc14/lib
  8. LIBS += -lTKBin
  9. LIBS += -lTKBinL
  10. LIBS += -lTKBinTObj
  11. LIBS += -lTKBinXCAF
  12. LIBS += -lTKBO
  13. LIBS += -lTKBool
  14. LIBS += -lTKBRep
  15. LIBS += -lTKCAF
  16. LIBS += -lTKCDF
  17. LIBS += -lTKD3DHost
  18. LIBS += -lTKD3DHostTest
  19. LIBS += -lTKDCAF
  20. LIBS += -lTKDFBrowser
  21. LIBS += -lTKDraw
  22. LIBS += -lTKernel
  23. LIBS += -lTKExpress
  24. LIBS += -lTKFeat
  25. LIBS += -lTKFillet
  26. LIBS += -lTKG2d
  27. LIBS += -lTKG3d
  28. LIBS += -lTKGeomAlgo
  29. LIBS += -lTKGeomBase
  30. LIBS += -lTKHLR
  31. LIBS += -lTKIGES
  32. LIBS += -lTKIVtk
  33. LIBS += -lTKIVtkDraw
  34. LIBS += -lTKLCAF
  35. LIBS += -lTKMath
  36. LIBS += -lTKMesh
  37. LIBS += -lTKMeshVS
  38. LIBS += -lTKMessageModel
  39. LIBS += -lTKMessageView
  40. LIBS += -lTKOffset
  41. LIBS += -lTKOpenGl
  42. LIBS += -lTKOpenGles
  43. LIBS += -lTKOpenGlesTest
  44. LIBS += -lTKOpenGlTest
  45. LIBS += -lTKPrim
  46. LIBS += -lTKQADraw
  47. LIBS += -lTKRWMesh
  48. LIBS += -lTKService
  49. LIBS += -lTKShapeView
  50. LIBS += -lTKShHealing
  51. LIBS += -lTKStd
  52. LIBS += -lTKStdL
  53. LIBS += -lTKSTEP
  54. LIBS += -lTKSTEP209
  55. LIBS += -lTKSTEPAttr
  56. LIBS += -lTKSTEPBase
  57. LIBS += -lTKSTL
  58. LIBS += -lTKTInspector
  59. LIBS += -lTKTInspectorAPI
  60. LIBS += -lTKTObj
  61. LIBS += -lTKTObjDRAW
  62. LIBS += -lTKToolsDraw
  63. LIBS += -lTKTopAlgo
  64. LIBS += -lTKTopTest
  65. LIBS += -lTKTreeModel
  66. LIBS += -lTKV3d
  67. LIBS += -lTKVCAF
  68. LIBS += -lTKView
  69. LIBS += -lTKViewerTest
  70. LIBS += -lTKVInspector
  71. LIBS += -lTKVRML
  72. LIBS += -lTKXCAF
  73. LIBS += -lTKXDE
  74. LIBS += -lTKXDECascade
  75. LIBS += -lTKXDEDRAW
  76. LIBS += -lTKXDEIGES
  77. LIBS += -lTKXDESTEP
  78. LIBS += -lTKXMesh
  79. LIBS += -lTKXml
  80. LIBS += -lTKXmlL
  81. LIBS += -lTKXmlTObj
  82. LIBS += -lTKXmlXCAF
  83. LIBS += -lTKXSBase
  84. LIBS += -lTKXSDRAW

步骤四:编译

出现常见错误:
??在这里插入图片描述

查看文章《关于 fatal error LNK1158: 无法运行“rc.exe” 的解决方法》解决。(注意:直接赋值rc相关文件到qt的msvc2015_64版bin文件夹是最好的)。
??在这里插入图片描述

至此,引入occ库是好了,但是我们还是要需要调用来检测。

步骤五:使用Demo进行编译运行检测

在这里插入图片描述
??光包含opencascade的bin是不够的(跟我们预期一样,但是编译不把其它库lib带进去,就不知道了):
??在这里插入图片描述

前面所有库的bin下面的dll都需要才可以正确运行起来,但是编译的时候确实不需要opencascade之外的lib了。
??结果跑起来,程序没什么东西的情况下,发布部署包(Qt5.9.3 msvc2017x64 opencascade-7.7.0),有220MB左右,如下图:
??在这里插入图片描述

一共303项:
??在这里插入图片描述

 

Demo关键源码

OccWidget.h

  1. protected slots: // 显示出来之后需要刷一下大小让occ窗口显示大小一致
  2. void slot_resize();
  3. protected: // 需要重写父类的三个函数
  4. QPaintEngine * paintEngine() const;
  5. void paintEvent(QPaintEvent *event);
  6. void resizeEvent(QResizeEvent *event);
  7. private: // occ的专属变量
  8. opencascade::handle<V3d_Viewer> _pV3dViewer;
  9. opencascade::handle<V3d_View> _pV3dView;
  10. opencascade::handle<Aspect_DisplayConnection> _pAspectDisplayConnection;
  11. opencascade::handle<OpenGl_GraphicDriver> _pOpenGLGraphicDriver;
  12. opencascade::handle<AIS_InteractiveContext> _pAisInteractiveContext;
  13. WId _wid;
  14. opencascade::handle<WNT_Window> _pWntWindow;
  15. };

occWidget.cpp

  1. void OccWidget::initControl()
  2. {
  3. // 初始化occ
  4. {
  5. // 显示到屏幕上
  6. setAttribute(Qt::WA_PaintOnScreen);
  7. // 创建连接显示设备
  8. _pAspectDisplayConnection = new Aspect_DisplayConnection();
  9. // 创建3D接口定义图形驱动
  10. _pOpenGLGraphicDriver = new OpenGl_GraphicDriver(_pAspectDisplayConnection);
  11. // 创建3D查看器对象,并指定图形驱动
  12. _pV3dViewer = new V3d_Viewer(_pOpenGLGraphicDriver);
  13. // 创建交互上下文对象,关联到3D查看器
  14. _pAisInteractiveContext = new AIS_InteractiveContext(_pV3dViewer);
  15. // 创建视图,并关联到3D查看器
  16. _pV3dView = _pV3dViewer->CreateView();
  17. // 获取窗口句柄并创建WNT_Window
  18. _wid = winId();
  19. _pWntWindow= new WNT_Window((Aspect_Handle)_wid);
  20. // 设置视图窗口
  21. _pV3dView->SetWindow(_pWntWindow);
  22. if(!_pWntWindow->IsMapped())
  23. {
  24. _pWntWindow->Map();
  25. _pV3dView->Redraw();
  26. }
  27. QTimer::singleShot(10, this, SLOT(slot_resize()));
  28. }
  29. }
  30. void OccWidget::slot_resize()
  31. {
  32. _pV3dView->MustBeResized();
  33. }
  34. QPaintEngine *OccWidget::paintEngine() const
  35. {
  36. return 0;
  37. }
  38. void OccWidget::paintEvent(QPaintEvent *event)
  39. {
  40. if(!_pV3dView.IsNull())
  41. {
  42. _pV3dView->Redraw();
  43. }
  44. QWidget::paintEvent(event);
  45. }
  46. void OccWidget::resizeEvent(QResizeEvent *event)
  47. {
  48. if(!_pV3dView.IsNull())
  49. {
  50. _pV3dView->MustBeResized();
  51. }
  52. QWidget::resizeEvent(event);
  53. }
 

入坑

入坑一:窗口拉伸出现重刷窗口问题

问题

拉伸的时候如下图:
??在这里插入图片描述

原因

判断是刷了但是好像被覆盖了,后来找到原因是手码的时候代码问题
??在这里插入图片描述

解决

在这里插入图片描述

入坑二:显示窗口第一次会出现重绘不对

问题

显示出现该问题
??在这里插入图片描述

拉伸下则刷新没问题了:
??在这里插入图片描述

原因

应该是刷新的问题,窗口没完全显示出来之前,是按照某个值(不定)刷的,这就跟动态布局在构造中获取大小不一致一样。

解决

这个只需要再构造中接一个槽函数(这个会确保启动后重新调用一次)。
??在这里插入图片描述

在这里插入图片描述

原文链接:https://www.cnblogs.com/qq21497936/p/18329608

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号