Qt+Occ创建3D环境

 occview窗口类继承于Qwideget,用过Qt的QGraphicsview和Scene视图-场景架构的可以将occview窗口类看作是view和Scene的结合体。对3D环境中视图的平移、旋转、放缩等等全是通过occview类的鼠标事件实现的;而且生成的3D图元都是经过occview的交互式上下文来显示。下面是occview窗口类的代码。

一.h文件

#ifndef OCCVIEW_H
#define OCCVIEW_H

#include <QWidget>
#include <QWidget>
#include<QDebug>
#include<QVector>
#include<AIS_InteractiveContext.hxx>
#include<OpenGl_GraphicDriver.hxx>
#include<V3d_View.hxx>
#include<V3d_Viewer.hxx>
#include<WNT_Window.hxx>
#include<Quantity_NameOfColor.hxx>
#include<gp_Pnt2d.hxx>
#include<QpointF>
#include<TopoDS_Shape.hxx>
#include<ProjLib.hxx>
#include<ElSLib.hxx>
#include <AIS_Manipulator.hxx>
#include<TopoDS_Face.hxx>
#include<BRepBuilderAPI_MakeFace.hxx>
#include<AIS_Shape.hxx>
namespace Ui {
class OccView;
}

class OccView : public QWidget
{
    Q_OBJECT

public:
    explicit OccView(QWidget *parent = 0);
     QPaintEngine *paintEngine() const;
    ~OccView();
Handle(V3d_View) m_view;
private:
    Ui::OccView *ui;
private:
    Handle(AIS_InteractiveContext) m_context;
    Handle(V3d_Viewer) m_viewer;
    Handle(Graphic3d_GraphicDriver) m_graphic_driver;
protected:
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);

};

#endif // OCCVIEW_H

二.cpp

#include "occview.h"
#include "ui_occview.h"

OccView::OccView(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::OccView)
{
    ui->setupUi(this);
    if(m_context.IsNull())//若交互式上下文为空
    {
        //此对象提供与X server的连接,在Windows和Mac OS中不起作用
        Handle(Aspect_DisplayConnection) m_display_connection=new Aspect_DisplayConnection();
       //创建OpenGl图形驱动
        if(m_graphic_driver.IsNull())
        {
            m_graphic_driver=new OpenGl_GraphicDriver(m_display_connection);
        }
        //获取QWidget的窗口系统标识符
        WId window_handle=(WId)winId();
        // 创建Windows NT 窗口
        Handle(WNT_Window) wind=new WNT_Window((Aspect_Handle)window_handle);
       //创建3D查看器
        m_viewer=new V3d_Viewer(m_graphic_driver);
        //创建视图
        m_view=m_viewer->CreateView();
        m_view->SetWindow(wind);
        //打开窗口
        if(!wind->IsMapped())
        {
            wind->Map();
        }
        //创建交互式上下文
        m_context=new AIS_InteractiveContext(m_viewer);
        //设置查看器的光照
        m_viewer->SetDefaultLights();
        //打开背景灯光
        m_viewer->SetLightOn();
        //设置视图的背景颜色为黑色
        m_view->SetBackgroundColor(Quantity_NOC_BLACK);
        m_view->MustBeResized();;
        //显示直角坐标系,可以配置在窗口显示位置、文字颜色、大小、样式
        m_view->TriedronDisplay(Aspect_TOTP_LEFT_LOWER,Quantity_NOC_GOLD,0.08,V3d_ZBUFFER);
       //设置交互式上下文的显示模式
        m_context->SetDisplayMode(AIS_Shaded,Standard_True);
        //设置模型高亮风格
        Handle(Prs3d_Drawer) t_hilight_style = m_context->HighlightStyle();
        t_hilight_style->SetMethod(Aspect_TOHM_COLOR);  // 颜色显示方式
        t_hilight_style->SetColor(Quantity_NOC_LIGHTYELLOW);    // 设置高亮颜色
        t_hilight_style->SetDisplayMode(1); // 整体高亮
        t_hilight_style->SetTransparency(0.2f); // 设置透明度

        // 设置选择模型的风格
        Handle(Prs3d_Drawer) t_select_style = m_context->SelectionStyle();  // 获取选择风格
        t_select_style->SetMethod(Aspect_TOHM_COLOR);  // 颜色显示方式
        t_select_style->SetColor(Quantity_NOC_LIGHTSEAGREEN);   // 设置选择后颜色
        t_select_style->SetDisplayMode(1); // 整体高亮
        t_select_style->SetTransparency(0.4f); // 设置透明度
    }
    setAttribute(Qt::WA_PaintOnScreen);
    setAttribute(Qt::WA_NoSystemBackground);
    setBackgroundRole(QPalette::NoRole);
    setFocusPolicy(Qt::StrongFocus);
    setMouseTracking(true);//设置鼠标跟踪
}
void OccView::paintEvent(QPaintEvent *)
{
   m_view->Redraw();
}

void OccView::resizeEvent(QResizeEvent *)
{
   if(!m_view.IsNull())
   {
       m_view->MustBeResized();
   }
}
QPaintEngine *OccView::paintEngine() const
{
    return 0;

}
OccView::~OccView()
{
    delete ui;
}

三:结果显示

问题与解决 

1、出现Qtmainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl OccView::OccView(class QWidget *)" (

解决:先把生成的debug文件全部删除,然后点菜单中的构建,然后重新进行构建项目,然后qmake, 之后重新编译。

参考:(​​​​​​(18条消息) mainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl about::about(class QWidget *)" (??0abo_qq_39836658的博客-CSDN博客

2、QPaintEngine *paintEngine() const函数必须有要不然结果是这样

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
当使用QT进行OCC 7.7的二次开发时,您可以结合QT的界面和OCC的功能来创建复杂的三维模型。以下是一个简单的示例,展示了如何在QT中使用OCC库进行三维模型的创建和显示。 首先,您需要在QT创建一个窗口,并添加一个3D视图部件来显示OCC模型。然后,您可以使用OCC的类和方法来创建和操作模型。 ```cpp #include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <AIS_InteractiveContext.hxx> #include <V3d_View.hxx> #include <TopoDS.hxx> #include <TopoDS_Shape.hxx> #include <BRepPrimAPI_MakeBox.hxx> #include <AIS_Shape.hxx> int main(int argc, char *argv[]) { // 初始化QT应用程序 QApplication app(argc, argv); // 创建一个窗口 QWidget window; window.setWindowTitle("OCC 7.7 Example"); QVBoxLayout *layout = new QVBoxLayout(&window); // 创建3D视图部件 Handle(AIS_InteractiveContext) context = new AIS_InteractiveContext; Handle(V3d_View) view = new V3d_View(context); layout->addWidget(view->getWidget()); // 创建一个立方体 BRepPrimAPI_MakeBox box(100, 100, 100); TopoDS_Shape shape = box.Shape(); // 将模型添加到交互式上下文中 Handle(AIS_Shape) aisShape = new AIS_Shape(shape); context->Display(aisShape, true); // 调整视图 view->FitAll(); // 显示窗口 window.show(); // 运行QT应用程序 return app.exec(); } ``` 在这个示例中,我们创建了一个QT窗口,并将3D视图部件添加到窗口中。然后,我们使用OCC创建一个立方体,并将其添加到交互式上下文中。最后,我们调整视图以适应模型,并显示窗口。 请注意,这只是一个简单的示例,仅展示了如何在QT中使用OCC库进行三维模型的创建和显示。您可以根据自己的需求进一步扩展和修改代码。 希望这个示例能对您有所帮助!如果您有任何其他问题,请随时提问。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值