若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140763014
长沙红胖子Qt(长沙创微智科)博文大全:开发技术聚集(包罗Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…
Qt开发专栏:三方库开发技术
上一篇:《Qt+OpenCascade开发条记(一):windows开发情况搭建(一):OpenCascade先容、下载和安装过程》
下一篇:敬请期待…
前言
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没有。
注意:最终是occ-7.7.0-msvc2015x64(开始以为是msvc2017,编译的时候才发现问题),前面这一段文章的截图就不更改了。
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
- 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
复制代码 步骤四:编译
出现常见错误:
查看文章《关于 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
- …
- 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开发情况搭建(一):OpenCascade先容、下载和安装过程》
下一篇:敬请期待…
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140763014
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |