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

相关文章

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti