Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

前言

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

 

Demo

  注意:用的是内部QWidget提升为OccWidget,边框都是9px默认。
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

 

编译器版本问题

  由于使用得occ的7.7,本身是msvc2015x64版本,所以Qt使用5.9.3的msvc2015x64版本(上一篇写成了msvc2017x64)。
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

 

搭建Qt开发环境

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

   Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

opencascade-7.7.0:拷贝inc和win64

  inc中是头文件, win64中有bin和lib,保持相对原路径,已防止后续跟踪目录一致。
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

rapidjson-1.1.0:拷贝include

  这个比较特殊,源文件就在头文件里面,不是生成库。
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

步骤三:配置pri引入库

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

INCLUDEPATH += $$PWD DEPENDPATH += $$PWD  HEADERS +=      $$PWD/OccManager.h  SOURCES +=      $$PWD/OccManager.cpp  # occ-7.7.0-msvc2015x64(openCascade-7.7.0-vc14-64) INCLUDEPATH += $$PWD/occ-7.7.0-msvc2015x64/opencascade-7.7.0/inc LIBS += -L$$PWD/occ-7.7.0-msvc2015x64/opencascade-7.7.0/win64/vc14/lib LIBS += -lTKBin LIBS += -lTKBinL LIBS += -lTKBinTObj LIBS += -lTKBinXCAF LIBS += -lTKBO LIBS += -lTKBool LIBS += -lTKBRep LIBS += -lTKCAF LIBS += -lTKCDF LIBS += -lTKD3DHost LIBS += -lTKD3DHostTest LIBS += -lTKDCAF LIBS += -lTKDFBrowser LIBS += -lTKDraw LIBS += -lTKernel LIBS += -lTKExpress LIBS += -lTKFeat LIBS += -lTKFillet LIBS += -lTKG2d LIBS += -lTKG3d LIBS += -lTKGeomAlgo LIBS += -lTKGeomBase LIBS += -lTKHLR LIBS += -lTKIGES LIBS += -lTKIVtk LIBS += -lTKIVtkDraw LIBS += -lTKLCAF LIBS += -lTKMath LIBS += -lTKMesh LIBS += -lTKMeshVS LIBS += -lTKMessageModel LIBS += -lTKMessageView LIBS += -lTKOffset LIBS += -lTKOpenGl LIBS += -lTKOpenGles LIBS += -lTKOpenGlesTest LIBS += -lTKOpenGlTest LIBS += -lTKPrim LIBS += -lTKQADraw LIBS += -lTKRWMesh LIBS += -lTKService LIBS += -lTKShapeView LIBS += -lTKShHealing LIBS += -lTKStd LIBS += -lTKStdL LIBS += -lTKSTEP LIBS += -lTKSTEP209 LIBS += -lTKSTEPAttr LIBS += -lTKSTEPBase LIBS += -lTKSTL LIBS += -lTKTInspector LIBS += -lTKTInspectorAPI LIBS += -lTKTObj LIBS += -lTKTObjDRAW LIBS += -lTKToolsDraw LIBS += -lTKTopAlgo LIBS += -lTKTopTest LIBS += -lTKTreeModel LIBS += -lTKV3d LIBS += -lTKVCAF LIBS += -lTKView LIBS += -lTKViewerTest LIBS += -lTKVInspector LIBS += -lTKVRML LIBS += -lTKXCAF LIBS += -lTKXDE LIBS += -lTKXDECascade LIBS += -lTKXDEDRAW LIBS += -lTKXDEIGES LIBS += -lTKXDESTEP LIBS += -lTKXMesh LIBS += -lTKXml LIBS += -lTKXmlL LIBS += -lTKXmlTObj LIBS += -lTKXmlXCAF LIBS += -lTKXSBase LIBS += -lTKXSDRAW 

步骤四:编译

  出现常见错误:
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

  查看文章《关于 fatal error LNK1158: 无法运行“rc.exe” 的解决方法》解决。(注意:直接赋值rc相关文件到qt的msvc2015_64版bin文件夹是最好的)。
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

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

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo
  光包含opencascade的bin是不够的(跟我们预期一样,但是编译不把其它库lib带进去,就不知道了):
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

  前面所有库的bin下面的dll都需要才可以正确运行起来,但是编译的时候确实不需要opencascade之外的lib了。
  结果跑起来,程序没什么东西的情况下,发布部署包(Qt5.9.3 msvc2017x64 opencascade-7.7.0),有220MB左右,如下图:
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

  一共303项:
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

 

Demo关键源码

OccWidget.h

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

occWidget.cpp

void OccWidget::initControl() {     // 初始化occ     {         // 显示到屏幕上         setAttribute(Qt::WA_PaintOnScreen);         // 创建连接显示设备         _pAspectDisplayConnection = new Aspect_DisplayConnection();         // 创建3D接口定义图形驱动         _pOpenGLGraphicDriver = new OpenGl_GraphicDriver(_pAspectDisplayConnection);         // 创建3D查看器对象,并指定图形驱动         _pV3dViewer = new V3d_Viewer(_pOpenGLGraphicDriver);         // 创建交互上下文对象,关联到3D查看器         _pAisInteractiveContext = new AIS_InteractiveContext(_pV3dViewer);         // 创建视图,并关联到3D查看器         _pV3dView = _pV3dViewer->CreateView();         // 获取窗口句柄并创建WNT_Window         _wid = winId();         _pWntWindow= new WNT_Window((Aspect_Handle)_wid);         // 设置视图窗口         _pV3dView->SetWindow(_pWntWindow);         if(!_pWntWindow->IsMapped())         {             _pWntWindow->Map();             _pV3dView->Redraw();         }         QTimer::singleShot(10, this, SLOT(slot_resize()));     } }  void OccWidget::slot_resize() {     _pV3dView->MustBeResized(); }  QPaintEngine *OccWidget::paintEngine() const {     return 0; }  void OccWidget::paintEvent(QPaintEvent *event) {     if(!_pV3dView.IsNull())     {         _pV3dView->Redraw();     }     QWidget::paintEvent(event); }  void OccWidget::resizeEvent(QResizeEvent *event) {     if(!_pV3dView.IsNull())     {         _pV3dView->MustBeResized();     }     QWidget::resizeEvent(event); } … 

 

入坑

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

问题

  拉伸的时候如下图:
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

原因

  判断是刷了但是好像被覆盖了,后来找到原因是手码的时候代码问题
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

解决

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

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

问题

  显示出现该问题
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

  拉伸下则刷新没问题了:
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

原因

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

解决

  这个只需要再构造中接一个槽函数(这个会确保启动后重新调用一次)。
  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

  Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo

发表评论

评论已关闭。

相关文章