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

相关文章

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i