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

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

时间:2024-07-29 10:39:26浏览次数:13  
标签: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是不够的(跟我们预期一样,但是编译不把其它库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);
}
…
 

入坑

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

问题

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

原因

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

解决

  在这里插入图片描述

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

问题

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

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

原因

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

解决

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

  在这里插入图片描述

标签:bin,Qt,lib,Demo,occ,64,LIBS,include,搭建
From: https://www.cnblogs.com/qq21497936/p/18329608

相关文章

  • Centos7下Docker搭建Matomo
    1.docker安装和启动wgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo-O/etc/yum.repos.d/docker-ce.repoyuminstalldocker-ce-ysystemctlstartdockersystemctlenabledockersystemctlstatusdocker2.配置镜像加速器 针对Docker客户端版......
  • vs2015+Qt环境问题汇总
    1、出现一下莫名奇妙的qt头文件编译报错可能原因是Qt版本太高,建议降低版本,VS2015与Qt5.12.9可以编译通过2、出现无法运行rc.exe错误左边项目资源管理器中右击-->属性-->常规->>目标平台选择8.13、打开.ui界面文件后提示打开错误1、右击ui文件,然后点【添......
  • AndroidStudio 开发环境搭建
    文章目录AndroidStudio开发环境搭建JDK下载与安装,配置环境变量JDK1.8下载安装配置环境变量新建JAVA_HOME编辑Path下载AndroidStudio最新版本历史版本先安装JDK,后启动AS以管理员身份运行打开解决双击打不开的问题Error:你的主机中的软件中止了一个已建立的连接(或如下......
  • 如何从零搭建一个动态网站
    静态网站和动态网站的区别        静态网站和动态网站的本质区别在于内容是否在服务器端动态生成,以及是否有服务器端逻辑处理用户请求和数据。        静态网站像是一本已经印刷好的书籍,而动态网站则像是根据读者需求即时编写和提供内容的智能机器。创建......
  • 【QT】事件分发器 & 事件过滤器
    qt系统-事件分发器and事件过滤器一、事件分发器1.事件分发器概念2.事件分发器工作原理二、事件过滤器一、事件分发器1.事件分发器概念在Qt中,事件分发器(EventDispatcher)是一个核心概念,用于处理GUI应用程序中的事件。事件分发器负责将事件从⼀个对象......
  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-01 软件工具环境搭建
    ​ 软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!本教程使用了米联客-MLK-L1-CZ06-DR1M90G开发板,购买链接:https://milianke.tmall.com/​1代码编辑vscode工具软件......
  • Qt Android 实现全屏
    本文内容参考自:https://blog.csdn.net/jun4331247/article/details/807396621.新建JFullScreen.java,添加以下代码,放置在QT安装目录\android_armv7\src\android\java\src\org\qtproject\qt5\android\bindingspackageorg.qtproject.junj;importandroid.app.Activity;import......
  • 实战|Qt开发WordBN笔记软件#10 添加Font Awesome字体图标
    01背景【WordBN字远笔记】是天恩软件工作室开发的一款免费笔记软件;WordBN基于VS2019、Qt6.5开发,使用QtQuick(QML)开发语言。本课程将以【WordBN字远笔记】的界面为实战基础,详细介绍如何基于Qt/QML开发语言,从零开始开发一套真正的程序,包括国际化、版本发布、安装包制作等项目......
  • 【QT】QT 系统相关(事件、文件、多线程、网络、音视频)
    一、Qt事件1、事件介绍事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发......
  • 【ESP01开发实例】-ESP-01开发环境搭建与固件烧录
    ESP-01开发环境搭建与固件烧录文章目录ESP-01开发环境搭建与固件烧录1、ESP-01介绍2、开发环境搭建3、固件下载3.1使用ArduinoUNO板对ESP8266(ESP-01)模块进行编程3.2使用USB转串口转换器对ESP8266(ESP-01)模块进行编程4、点亮LED本文将......