Qt+OpenCascade开发笔记(二):windows开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo
前言
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 += $$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开发环境搭建(二):Qt引入occ库,搭建基础工程模板Demo和发布Demo的更多相关文章
- [开发笔记]-控制Windows Service服务运行
用代码实现动态控制Service服务运行状态. 效果图: 代码: #region 启动服务 /// <summary> /// 启动服务 /// </summary> /// ...
- (二)react-native开发系列之windows开发环境配置
之前写了react-native在mac上得环境搭建,但是如果只开发android的话,只要用windows系统就可以了,下面就来说下react-native的windows开发环境配置. 1.下载配 ...
- Kinect开发笔记之三Kinect开发环境配置具体解释
0.前言: 首先说一下我的开发环境,Visual Studio是2013的,系统是win8的64位版本号,SDK是Kinect for windows SDK 1.8版本 ...
- 《ArcGIS Runtime SDK for .Net开发笔记》--介绍与环境搭建
一. ArcGIS Runtime SDK for .NET介绍 ArcGIS Runtime SDK for .net是一款针对windows平台的开发包.能够在开发出在windows phone, ...
- [Openwrt 项目开发笔记]:Openwrt必要设置(二)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 前面的两篇blog中,我将如何搭建Openwrt ...
- Android开发笔记:Android开发环境搭建
基于Eclipse开发 1. 安装JDK 首先进入JDK下载页面,选择需要的版本下载安装. JDK 下载地址:https://www.oracle.com/technetwork/java/javas ...
- 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求
第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...
- Mqtt开发笔记:windows下C++ ActiveMQ客户端介绍、编译和使用
前话 项目需求,需要使用到mqtt协议,之前编译QtMqtt库,不支持队列模式queue(点对点),只支持订阅/发布者模式.,所以使用C++ ActiveMQ实现. MQTT协议 简介 M ...
- PHP移动互联网开发笔记(1)——环境搭建及配置
开篇说明:记得我上大二的时候第一次听到PHP,当时只知道这是一个开发网站的语言,并没有深入学习,在学了Java Web开发和Android开发之后我对互联网的发展方向有了一个我自己的认识,现在我们不能 ...
- LeapMotion控制器 java语言开发笔记--(Java开发环境的准备)
(1)官方文档说的是必须是JDK6,JDK7,我试了一下JDK8也是可以的 (2)我是在Windows系统下用的是Eclipse Java的开发环境这里不再多说.将下载的JDK里面的java.dll和 ...
随机推荐
- 利用instruments工具查看其它app的性能
1.随便建立一个新的工程文件,profile,进入instruments 2.选中activity,可以看到所有进程,以及其它进程的CPU占用情况
- NOIP模拟87(多校20)
前言 题目不难,但是个人感觉小细节有一些,然后有亿点卡常.. 感觉对于笛卡尔树的题目看不出算法,然后代码实现方面细节注意太少,常数有点大. 下次注意吧. T1 集合均值 解题思路 感觉应该是期望题里面 ...
- 8.21考试总结(NOIP模拟45)[打表·蛇·购物·ants]
有型的东西终究会消逝,不过--终于,这份回忆还是永远不朽的- 前言 这次考试暴露出来了不少问题. 比如答题策略策略不当导致 T2 的 65pts 暴力根本没有打. 知识遗忘太快不牢固,T4 是之前的一 ...
- MyBatis实现MySQL表字段及结构的自动增删
前言 在开发过程中,总会涉及到数据库表结构字段的增加或者删除,或者是索引的增加和减少,这个时候能把修改表结构字段这些工作都交给程序来进行,那能大大方便开发.正好有一个现成的工具可以在springboo ...
- 别想宰我,怎么查看云厂商是否超卖?详解 cpu steal time
据说有些云厂商会超卖,宿主有 96 个核心,结果卖出去 100 多个 vCPU,如果这些虚机负载都不高,大家相安无事,如果这些虚机同时运行一些高负载的任务,相互之间就会抢占 CPU,对应用程序有较大影 ...
- mongodb创建索引和删除索引和背景索引background
mongodb创建索引和删除索引和背景索引background MongoDB的背景索引允许在后台创建和重建索引,而不会对数据库的正常操作产生影响.背景索引的创建过程是非阻塞的,可以在业务运行时创建或 ...
- mongodb数据库连接格式
mongodb数据库连接格式 mongodb://账号:密码@mongodb服务器IP:27017/数据库名称
- 关于 "= default" 和 "= delete" 函数
在 C++ 11 中,"= default" 和 "= delete" 函数使我们能够显示指定成员函数是否自动生成. 其中,"= delete&quo ...
- 红黑树详细讲解(结合JavaTreeMap)
1:红黑树简介 红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性.同时红黑树更是一颗自平衡的排序二叉树.根据二叉查找树的概念可以得出正常情况下查找的时间复杂度为O(log n),但是 ...
- Kubernetes(四)Pod详解
Pod详解 本章主要介绍Pod资源的各种配置(yaml文件)和原理 1. Pod介绍 如上图所示,每个Pod中都可以包含一个或多个Container,这些Containers 可以分为2类: 用户程序 ...