Qt+OpenCascade開發筆記(二):windows開發環境搭建(二):Qt引入occ庫,搭建基礎工程模板Demo和釋出Demo

长沙红胖子Qt發表於2024-07-29

前言

  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);
}
…

入坑

入坑一:視窗拉伸出現重刷視窗問題

問題

  拉伸的時候如下圖:
  在這裡插入圖片描述

原因

  判斷是刷了但是好像被覆蓋了,後來找到原因是手碼的時候程式碼問題
  在這裡插入圖片描述

解決

  在這裡插入圖片描述

入坑二:顯示視窗第一次會出現重繪不對

問題

  顯示出現該問題
  在這裡插入圖片描述

  拉伸下則重新整理沒問題了:
  在這裡插入圖片描述

原因

  應該是重新整理的問題,視窗沒完全顯示出來之前,是按照某個值(不定)刷的,這就跟動態佈局在構造中獲取大小不一致一樣。

解決

  這個只需要再構造中接一個槽函式(這個會確保啟動後重新呼叫一次)。
  在這裡插入圖片描述

  在這裡插入圖片描述

相關文章