qt对stl模型显示的封装

我一直都想把vtk显示这一块做成一个封装的静态lib,然后别的类只需要我暴露出的头文件和lib文件就可以了,这次我实现的是对一个放stl文件的文件夹下的stl文件做显示,用的是vs2017+qt,实现的主要效果如下:
在这里插入图片描述
因为qt自身带的标题栏显示有点单调,我们这里使用了自定义标题栏。
stl模型主要是这样被显示的:
在这里插入图片描述
封装的代码:

#pragma once

#include <vtkAutoInit.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSTLReader.h>
#include <vtkSmartPointer.h>
#include <QVTKWidget.h>
#include <QtWidgets/QWidget>
#include <QtWidgets/qpushbutton.h>
#include <QtWidgets/qlayout.h>
#include <QtWidgets/qlabel.h>
#include <QtGui/qevent.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);


#pragma once


class STLVTK : public QWidget
{
    Q_OBJECT

public:
    STLVTK(QWidget *parent = nullptr);
    ~STLVTK();
	void OpenSTLFiles(QString stlfolder);
	void STLShow();
private:
	void initWidget();
	QVTKWidget* m_vtkWidget = nullptr;
	QPoint m_dragPosition;
	QPushButton *m_closeButton = nullptr;
	QLabel *m_mainContent = nullptr;
protected:
	void mousePressEvent(QMouseEvent *event) override;
	void mouseMoveEvent(QMouseEvent *event) override;
};

对外只有两个函数,一个是显示一个是指定文件夹下模型路径

#include "STLVTK.h"
#include <QtWidgets/qfiledialog.h>
#include <vtkCornerAnnotation.h>
#include <vtkTextProperty.h>
#include <vtkTextActor.h>

STLVTK::STLVTK(QWidget *parent)
    : QWidget(parent)
{
	initWidget();
}

STLVTK::~STLVTK()
{}

void STLVTK::OpenSTLFiles(QString stlfolder){
	QDir dir(stlfolder);
	QStringList stlFiles = dir.entryList(QStringList() << "*.stl", QDir::Files);
	for (int i = 0; i < stlFiles.size(); ++i) {
		vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
		reader->SetFileName(dir.filePath(stlFiles[i]).toStdString().c_str());
		reader->Update();

		vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
		mapper->SetInputConnection(reader->GetOutputPort());

		vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
		actor->SetMapper(mapper);

		vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
		renderer->AddActor(actor);

		
		// 计算合适的位置布局
		int numRows = std::ceil(std::sqrt(stlFiles.size()));
		int numCols = std::ceil((float)stlFiles.size() / numRows);

		double width = 1.0 / numCols;
		double height = 1.0 / numRows;

		double xIndex = i % numCols;
		double yIndex = i / numCols;

		renderer->SetViewport(xIndex * width, (numRows - yIndex - 1) * height, (xIndex + 1) * width, (numRows - yIndex) * height);

		m_vtkWidget->GetRenderWindow()->AddRenderer(renderer);
	}
#if 0
	vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
	reader->SetFileName(stlfolder.toStdString().c_str());
	reader->Update();

	//将source转换成mapper
	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(reader->GetOutputPort());

	//送入渲染引擎进行显示
	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);

	//渲染
	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	renderer->AddActor(actor);
	renderer->SetBackground(.0, .0, .0);

	//设置渲染窗口
	vtkSmartPointer<vtkRenderWindow> window = vtkSmartPointer<vtkRenderWindow>::New();
	m_vtkWidget->SetRenderWindow(window);
	m_vtkWidget->GetRenderWindow()->AddRenderer(renderer);
#endif
}

void STLVTK::STLShow()
{
	this->show();
}

void STLVTK::initWidget()
{
	setWindowFlags(Qt::FramelessWindowHint);
	QHBoxLayout* hlayout1 = new QHBoxLayout;
	QHBoxLayout* hlayout2 = new QHBoxLayout;
	m_mainContent = new QLabel;
	m_mainContent->setStyleSheet("background-color: rgb(0, 0, 139);");
	m_mainContent->setFixedHeight(50);

	m_closeButton = new QPushButton;
	m_closeButton->setObjectName("CloseButton");
	m_closeButton->setStyleSheet("QPushButton {"
		"background-image:url(:/sysButton/sysbutton/close.png);"
		"background-repeat: no-repeat;"
		"background-position: center;"
		"}");
	QLabel* label = new QLabel(QString::fromLocal8Bit("预览打印"));
	label->setStyleSheet("color: #FDF5E6;");
	hlayout1->addWidget(label);
	hlayout1->addStretch();
	hlayout1->addWidget(m_closeButton);

	m_mainContent->setLayout(hlayout1);
	m_mainContent->setMargin(0);
	connect(m_closeButton, &QPushButton::clicked, this, &QWidget::hide);

	QWidget *widget = new QWidget();
	widget->setObjectName("modelwidget");
	widget->setStyleSheet("#modelwidget {"
		"background-image:url(:/BackGround/background/center_bg.png);"
		"}");

	m_vtkWidget = new QVTKWidget;
	m_vtkWidget->setFixedSize(1300, 800);

	hlayout2->addWidget(m_vtkWidget);
	widget->setLayout(hlayout2);

	QVBoxLayout *mainLayout = new QVBoxLayout();
	mainLayout->setMargin(3);
	mainLayout->addWidget(m_mainContent);
	mainLayout->addWidget(widget);


	setLayout(mainLayout);
	this->setStyleSheet("background-color: rgb(250, 255, 250)");
}

void STLVTK::mousePressEvent(QMouseEvent * event){
	if (event->button() == Qt::LeftButton)
	{
		m_dragPosition = event->globalPos() - frameGeometry().topLeft();
		event->accept();
	}
}

void STLVTK::mouseMoveEvent(QMouseEvent * event)
{
	if (event->buttons() == Qt::LeftButton)
	{
		move(event->globalPos() - m_dragPosition);
		event->accept();
	}
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/397284.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAN_相关的测试用例+测试方法+测试工具使用+输出测试报告

测试类型: 第一:通信测试 第二:间接网络管理测试 第三:AUTOSAR网络管理测试 第四:诊断协议栈Diva测试 第五:诊断协议补充测试 第六:Bootloader测试 第七:网…

用html编写的招聘简历

用html编写的招聘简历 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

架构师蓝图: 理解软件风格与模式

本文介绍了10种软件架构风格及其对应设计模式&#xff0c;梳理了各个风格的优缺点和适用场景&#xff0c;帮助读者在架构选项过程中能有的放矢&#xff0c;做出更适合业务场景的架构设计。原文: The Architect’s Blueprint: Understanding Software Styles and Patterns with …

onlyoffice document builder使用

office这个体系分为四个大教程 1、【document server文档服务器基础搭建】 2、【连接器(connector)或者jsApi调用操作office】-进阶 3、【document builder文档构造器使用】-进阶 4、【Conversion API(文档转化服务)】-进阶 如果需要连接器&#xff0c;可以查看&#xff1…

认识Redis:不只是缓存,还有这些厉害的功能!

在当今数据驱动的世界中&#xff0c;快速存取信息成为了技术发展的关键。而在众多存储解决方案中&#xff0c;Redis以其独特的魅力和强大的功能&#xff0c;成为了开发者们的宠儿。今天&#xff0c;就让我们一起来认识一下Redis。 一、Redis是什么&#xff0c;可以用来干什么&…

EasyRecovery易恢复中文破解版2024最新破解序列号

EasyRecovery易恢复是一款来自美国的数据恢复软件&#xff0c;已有35年&#xff08;或38年&#xff09;的历史。它支持不同存储介质的数据恢复&#xff0c;包括电脑系统硬盘、移动硬盘等&#xff0c;并针对不同的数据丢失原因提供了相应的恢复方案。 EasyRecovery易恢复是一款功…

【清关知识】毛里求斯的清关文件及清关手续

1、清关文件 1&#xff09;发票 海关发票&#xff08;3份&#xff09;、商业发票。所有货物随货发票必须为正本原始发票&#xff0c;所有进口商在办理清关提货手续时&#xff0c;首先必须向海关呈交商业登记号码&#xff0c;凭此登记号码才可向公司注册局登记。 2&#xff0…

【linux】体系结构和os管理

冯诺依曼体系结构 输入单元&#xff1a;包括键盘, 鼠标&#xff0c;扫描仪, 写板等 中央处理器(CPU)&#xff1a;含有运算器和控制器等 输出单元&#xff1a;显示器&#xff0c;打印机等 这里的存储器指的是内存 三者是相互连接的&#xff0c;设备之间会进行数据的来回拷贝&am…

以理论89、上机100分成绩终于通过了OceanBase OBCP的考试

OceanBase OBCP的考试分为理论考试和上机考试&#xff0c;跟OBCA认证考试比较来说&#xff0c;难度上升了一个很多大的层次。OBCA我是好几年前考的了&#xff0c;现在因为公司再去o&#xff0c;准备进OceanBase&#xff0c;所以必须快速考出OBCP证书&#xff0c;本来想着直接背…

【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),流程描述篇

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

【Java】图解 JVM 垃圾回收(二):垃圾收集器、Full GC

图解 JVM 垃圾回收&#xff08;二&#xff09; 1.垃圾收集器1.1 内存分配与回收策略1.2 Serial 收集器1.3 Parallel Scavenge 收集器1.4 ParNew 收集器1.5 CMS 收集器1.6 G1 收集器 2.Full GC 的触发条件 1.垃圾收集器 Java 虚拟机提供了多种垃圾回收器&#xff0c;每种回收器…

postgresql 文件结构(一) 数据库、表对应的文件

1、问题 甲方要求提供数据库数据量大小&#xff0c;由于各个业务数据库共用一个postgres&#xff0c;因此想把每个数据库占用的空间都统计一下。 2、查找物理存储文件目录 如下图所示&#xff0c;可以查询表、库的物理存储文件名称 -- 查询表对应的文件 select oid,relname…

c编译器学习02:chibicc文档翻译

目的 先粗略地看一遍作者的书籍。 原文档地址 https://www.sigbus.info/compilerbook# “低レイヤを知りたい人のためのCコンパイラ作成入門” 为想了解底层的人准备的C编译器制作入门 Rui Ueyama ruiucs.stanford.edu 2020-03-16 作者简介 https://www.sigbus.info/ 植山…

【前端素材】几款实用的后台管理系统html模板(附带源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

flink多流操作(connect cogroup union broadcast)

flink多流操作 1 分流操作2 connect连接操作2.1 connect 连接&#xff08;DataStream,DataStream→ConnectedStreams)2.2 coMap&#xff08;ConnectedStreams → DataStream&#xff09;2.3 coFlatMap&#xff08;ConnectedStreams → DataStream&#xff09; 3 union操作3.1 u…

一文搞懂LDO !

7.LDO 1.原理 通过运放调节P-MOS的输出 低压差&#xff1a; 输出压降比较低&#xff0c;例如输入3.3V&#xff0c;输出可以达到3.2V。 线性&#xff1a; LDO内部的MOS管工作于线性状态。&#xff08;可变电阻区&#xff09; 稳压器&#xff1a; 说明了LDO的用途是用来给电…

LeetCode.590. N 叉树的后序遍历

题目 590. N 叉树的后序遍历 分析 我们之前有做过LeetCode的 145. 二叉树的后序遍历&#xff0c;其实对于 N 叉树来说和二叉树的思路是一模一样的。 二叉树的后序遍历是【左 右 根】 N叉树的后序遍历顺序是【孩子 根】&#xff0c;你可以把二叉树的【左 右 根】想象成【孩子…

Win11专业版安装集成了谷歌框架的安卓子系统,包含谷歌商店

1.摘要 上一篇博客讲述了使用微软商店安装安卓子系统的教程 https://blog.csdn.net/RudeTomatoes/article/details/135958882 上述方法的优点是安装过程简单&#xff0c;但是&#xff0c;由于Windows安卓子系统是微软与亚马逊联合开发&#xff0c;默认没有安装谷歌框架。我尝试…

[SwiftUI]自定义下划线

系统有一个下划线修饰&#xff0c;但最低只支持到iOS16。 extension View {available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *)public func underline(_ isActive: Bool true, pattern: Text.LineStyle.Pattern .solid, color: Color? nil) -> some View} 下…

金融帝国实验室(CapLab)官方更新_V9.1.62版本(2024年第10次)

〖金融帝国实验室〗&#xff08;Capitalism Lab&#xff09;游戏更新记录&#xff08;2024年度&#xff09; ————————————— ◎游戏开发&#xff1a;Enlight Software Ltd.&#xff08;微启软件有限公司&#xff09; ◎官方网站&#xff1a;https://www.capitalism…