首页 > 其他分享 >Qt+OpenCascade开发笔记(二):Qt引入occ库,搭建工程模板发布Demo

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

时间:2024-08-25 22:05:20浏览次数:8  
标签:bin Qt lib Demo occ 64 LIBS include

前言

  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是不够的(跟我们预期一样,https://www.ea55.com/但是编译不把其它库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:                  // 55律网需要重写父类的三个函数
    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);}…

入坑

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

问题

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

原因

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

解决

   在这里插入图片描述

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

问题

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

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

原因

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

解决

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

   在这里插入图片描述

标签:bin,Qt,lib,Demo,occ,64,LIBS,include
From: https://www.cnblogs.com/77cxw/p/18379612

相关文章

  • 除Qt以外的C++GUI库
    ImGui图形用户界面项目Github地址:https://github.com/ocornut/imguiwxWidgetsHome:https://wxwidgets.org/。NanoGUINanoGUI是用于OpenGL3+、GLES2/3和Metal的极简跨平台工具库。RmlUiRmlUi是基于HTML和CSS标准的C++GUI库,目标是为任何项目的界面需求提供完整的解决......
  • Qt (10)【Qt窗口 —— 如何在窗口中创建浮动窗口和状态栏】
    阅读导航引言一、如何在窗口中创建浮动窗口1.浮动窗口的创建2.设置停靠的位置二、如何在窗口中创建状态栏1.状态栏的创建2.在状态栏中显示实时消息3.在状态栏中显示永久消息4.调整显示消息的位置,并加上进度条引言在上一篇文章中,我们一同探索了Qt窗口设计中的......
  • 解决Qt creator5..中文乱码问题
    1.工具->选项2.两种方案供选择    a.头文件(或目标文件)添加预编译指令:                #ifdefined(_MSC_VER)&&(_MSC_VER>=1600)#pragmaexecution_character_set("utf-8")#endif    b.编辑->SelectEncoding...->savewithE......
  • Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和
    一、前言随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求。之前就已经打通了音视频文件和视频流的采集,那是不是可以简单点的方式就能直接加入到原有的......
  • 【Qt】信号和槽
    文章目录1.信号和槽的基本概念处理的先后顺序connect函数的用法connect函数使用练习2.自定义信号和槽自定义槽函数第二种定义槽函数的方式第二种定义槽函数的方式自定义信号3.带参数的信号和槽参数个数的影响参数类型的影响4.信号和槽存在的意义5.信号......
  • QT-release打包程序
    QT-release打包程序哦知识阿赐予我力量活着就好​关注 QT-release打包程序主要介绍qt编写好程序后运行release生成的exe文件,之后用qt的编译程序生成qt可执行环境,之后就可以压缩打包发给用户使用!1.构建运行qt的程序​用我现在测试的demo程序为例​点击......
  • PyQt5 / PySide 2 + Pywin32 自定义标题栏窗口 + 还原 Windows 原生窗口边框特效(2)
    前言:已修复上一篇文章中提到的Bug,增加状态切换动画:PyQt5/PySide2+Pywin32自定义标题栏窗口+还原Windows原生窗口边框特效-CSDN博客https://blog.csdn.net/2402_84665876/article/details/141487635?spm=1001.2014.3001.5501仍然存在的问题:打开窗口时窗口标题栏......
  • PYQT5的环境配置
    一。前言系统:win11最近开始了解qt,想用qt来做一些实践项目,于是先开始了环境配置。最开始想分别配置python的环境和qt环境python环境配置简单,输入官网:python.org  找到download,在里面找到对应的python版本下载就行了,我下载的版本是3.12.5 应该是最新版本,下载完成后打开......
  • # 为什么Qt源码中要用d_ptr和q_ptr
    为什么需要d_ptr和q_ptr  Qt中的公有类中一般都会包含d_ptr这样一个私有类型的指针,指针指向该类对应的私有类,引入这个指针主要是为了解决二进制兼容的问题。q_ptr是和d_ptr配套的,后面会介绍到。什么是二进制兼容  Qt作为一个第三方库,发布后会有很多公有类提供给第三方使用......
  • Java实现MQTT通信(发布订阅消息)
    文章目录前言一、相关pom依赖二、相关代码1.MQTT工具类2.MQTT回调函数3.订阅消息4.发布消息三、安装mosquitto1.mosquitto简介2.下载四、安装MQTT.fx1.MQTT.fx简介2.下载3.使用五、java订阅消息六、java发布消息前言MQTT是一种轻量级的物联网通信协议,基于客户端-......