Qt+Occ创建3D环境

2024-03-26 23:40
文章标签 qt 创建 环境 3d occ

本文主要是介绍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_OBJECTpublic: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函数必须有要不然结果是这样

 

这篇关于Qt+Occ创建3D环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850248

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

MySQL 临时表创建与使用详细说明

《MySQL临时表创建与使用详细说明》MySQL临时表是存储在内存或磁盘的临时数据表,会话结束时自动销毁,适合存储中间计算结果或临时数据集,其名称以#开头(如#TempTable),本文给大家介绍M... 目录mysql 临时表详细说明1.定义2.核心特性3.创建与使用4.典型应用场景5.生命周期管理6.注

MySQL的触发器全解析(创建、查看触发器)

《MySQL的触发器全解析(创建、查看触发器)》MySQL触发器是与表关联的存储程序,当INSERT/UPDATE/DELETE事件发生时自动执行,用于维护数据一致性、日志记录和校验,优点包括自动执行... 目录触发器的概念:创建触www.chinasem.cn发器:查看触发器:查看当前数据库的所有触发器的定

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Java 与 LibreOffice 集成开发指南(环境搭建及代码示例)

《Java与LibreOffice集成开发指南(环境搭建及代码示例)》本文介绍Java与LibreOffice的集成方法,涵盖环境配置、API调用、文档转换、UNO桥接及REST接口等技术,提供... 目录1. 引言2. 环境搭建2.1 安装 LibreOffice2.2 配置 Java 开发环境2.3 配