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

news/2024/11/14 5:41:33/文章来源:https://www.cnblogs.com/qq21497936/p/18329608

前言

  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

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWDHEADERS += \$$PWD/OccManager.hSOURCES += \$$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);
}
…
 

入坑

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

问题

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

原因

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

解决

  在这里插入图片描述

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

问题

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

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

原因

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

解决

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

  在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/773510.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7/26admin投放端代码理解

xorm是一个数据库映射框架

chsap连接Mysql

前置操作 打开MySql服务 添加引用MySql.Data.dll 数据库查询数据 读取一条数据,直接运行就能看到打印台输出。1 using Mysql.Data.MyAqlClient;2 static void Main(string[] args)3 {4 string connStr="Database=test007;Data Source=127.0.0.1;port=3306;User Id=ro…

论文阅读:BERT-Based Chinese Relation Extraction for Public Security

模型框架 包含一个BERT模型层(嵌入+编码+池化->得到句子的特征向量)、一个Dropout层(防止过拟合)。基于BERT的预训练模型 BERT模型是通过注意力机制对训练集进行处理。然后,通过Embedding层和Encoder层加载预训练的词向量。 最后,Pooling 层使用 BERT 模型来训练两个句…

现在有什么赛道可以干到退休?

一个小小评论区惊现阿里和腾讯的两位大佬!他们干到退休应该是没什么问题,那你们呢?文中还有粉丝投稿的一次完整面试的面经,速来围观。最近,一则“90后无论男女都得65岁以后退休”的消息在多个网络平台流传,也不知道是真是假,好巧不巧今天刷热点的时候又看到一条这样的热…

vue.config.js的作用(修改webpack相关配置,读取入口文件,模版文件等)

在vue项目下有名为vue.config.js的文件,该文件可以配置webpack读取入口,模版文件的配置 在左测的配置都是可以修改的 上述在pages的属性对象中对entry入口进行修改了,将main.js修改为了lgx.js后续要更改webpack的配置可以直接在vue2配置参考上进行查看

【FMC155】基于VITA57.1标准的2路500MSPS/1GSPS/1.25GSPS 14位直流耦合AD采集FMC子卡模块

板卡概述FMC155是一款基于VITA57.1标准的,实现2路14-bit、500MSPS/1GSPS/1.25GSPS 直流耦合ADC同步采集FMC子卡模块。该模块遵循VITA57.1规范,可直接与FPGA载卡配合使用,板卡ADC器件采用ADI的AD9680芯片,该芯片具有两个模拟输入通道和两个JESD204B输出数据通道对,可用于高…

GreatSQL 的刷新锁

GreatSQL 的刷新锁前言 因为运维小伙伴执行dump备份命令,导致数据库卡住,很多会话都在waiting for table flush,基于这一故障,我对GreatSQL的刷新锁进行了研究。感兴趣的小伙伴请随我一探究竟吧。 刷新锁的症状 刷新锁问题的主要症状是数据库会进入嘎然而止的状态,所有需要…

【AI模型】PPT生成

一、天工AIhttps://www.tiangong.cn/ 先对话进行提纲生成,然后可以编辑提纲,再进行PPT生成 生成完毕后,可以直接点击导出下载 二、星火讯飞 讯飞智文 生成的PPT相比天工的要略微简单,没有配图信息 同样可以导出下载

一个基于 SpringBoot + Vue 复刻高仿B站的视频网站!

Teriteri —— 一个采用前后端分离的模式,参考 Bilibili PC 端,基于 SpringBoot + Vue3 实现的弹幕视频网站。大家好,我是 Java陈序员。 今天,给大家介绍一个开源的视频网站,复刻高仿B站!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算…

VirtualBox 7.0.20 (macOS, Linux, Windows) - 开源跨平台虚拟化软件

VirtualBox 7.0.20 (macOS, Linux, Windows) - 开源跨平台虚拟化软件VirtualBox 7.0.20 (macOS, Linux, Windows) - 开源跨平台虚拟化软件 Oracle VM VirtualBox 7 请访问原文链接:https://sysin.org/blog/virtualbox-7/,查看最新版。原创作品,转载请保留出处。VirtualBox 简…

C# 推荐一种开机自启动的方式

直接写到用户开机自启动目录里,系统开机会带着一起启动。cmd-shell:startup可验证是否成功生成快捷方式到启动目录。概述(Overview)网上多数搜索结果以注册表设置为优先,这个方法需要管理员权限,实际工作中可能并不适用。这个方法是直接写到用户开机自启动目录里,系统开机会…