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

CSDN 2024-08-20 11:05:03 阅读 50

若该文为原创文章,转载请注明原文出处

本文章博客地址: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

<code>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

<code>…

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。