当前位置: 首页 > news >正文

QT传输函数控件设计5 显示体渲染效果

初期为了简单,我们就直接在open()函数下面直接继续写。

为了保证没有读到文件就不处理下面的显示,我们就在上面定义一个flag,只有在文件数量>20的时候,flag = 1; 然后接着写:

	if (flag == 1) {

	}

我们接下来的功能都是在这里面实现的。

注意先包含一堆头文件:

#include <vtkImageData.h>
#include <vtkDICOMImageReader.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkPiecewiseFunction.h>
#include <vtkColorTransferFunction.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkPointData.h>
#include <vtkCamera.h>
#include <vtkNew.h>
#include <vtkFloatArray.h>
#include <vtkImageViewer2.h>
#include <vtkEventQtSlotConnect.h>

然后开始在 if 语句里面写:

		vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::New();
		vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
		vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
		vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
		vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
		vtkSmartPointer<vtkPiecewiseFunction> gradientTF = vtkSmartPointer<vtkPiecewiseFunction>::New();
		vtkSmartPointer<vtkPiecewiseFunction> scalarTF = vtkSmartPointer<vtkPiecewiseFunction>::New();
		vtkSmartPointer<vtkColorTransferFunction> colorTF = vtkSmartPointer<vtkColorTransferFunction>::New();
		vtkSmartPointer< vtkImageViewer2 >           m_pImageViewer;
		vtkSmartPointer< vtkRenderer >                   m_pRenderder;

		m_pRenderder = vtkSmartPointer< vtkRenderer >::New();
		// 设置m_QVTKWidget的渲染器
		myQVTKWidget->GetRenderWindow()->AddRenderer(m_pRenderder);
		vtkSmartPointer<vtkGPUVolumeRayCastMapper> mapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
		vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();

就是首先定义了一堆对象(都用智能指针管理的)。

然后

		std::string strFolder = DcmPathName.toStdString(); //put your directory path here

										// read the dicom dir
		reader->SetDirectoryName(strFolder.c_str());
		reader->Update();
		imageData->ShallowCopy(reader->GetOutput());

把我们的文件路径导入。记得要使用toStdString函数转换成标准字符串。不然VTK接收不了QString,然后再把下面这一坨东西都放上去:

// properties options

		volumeProperty->ShadeOn();
		volumeProperty->SetInterpolationType(VTK_LINEAR_INTERPOLATION);

		// get the real range in hounsfield 
		vtkDataArray* arr = reader->GetOutput()->GetPointData()->GetScalars();
		double range[2];
		arr->GetRange(range);



		// 1D transfer functions
		colorTF->AddRGBPoint(-200, 0.0, 0.0, 0.0);
		colorTF->AddRGBPoint(150, 0.1, 0.1, 0.7);
		colorTF->AddRGBPoint(350, 0.2, 0.2, 0.4);
		colorTF->AddRGBPoint(512, 1.0, 1.0, 1.0);
		colorTF->AddRGBPoint(range[1], 0.9, 0.1, 0.1);

		scalarTF->AddPoint(-200, 0.00);
		scalarTF->AddPoint(150, 0.20);
		scalarTF->AddPoint(350, 0.30);
		scalarTF->AddPoint(512, 0.5);
		scalarTF->AddPoint(range[1], 0.4);

		gradientTF->AddPoint(-200, 0.0);
		gradientTF->AddPoint(150, 0.1);
		gradientTF->AddPoint(350, 0.1);
		gradientTF->AddPoint(512, 0.6);
		gradientTF->AddPoint(range[1] / 4.0, 1.0);

		volumeProperty->SetScalarOpacity(scalarTF);
		volumeProperty->SetGradientOpacity(gradientTF);
		volumeProperty->SetColor(colorTF);

		// setup rendering context
		myQVTKWidget->GetRenderWindow()->SetSize(myQVTKWidget->width(), myQVTKWidget->height());
		myQVTKWidget->GetRenderWindow()->SetMultiSamples(0);

		// mapping data
		mapper->SetInputConnection(reader->GetOutputPort());
		mapper->SetBlendModeToComposite();
		mapper->SetUseJittering(1);

		// renderer and volume
		myQVTKWidget->GetRenderWindow()->AddRenderer(m_pRenderder);
		m_pRenderder->SetBackground(0.03, 0.33, 0.33);

		volume->SetMapper(mapper);
		volume->SetProperty(volumeProperty);
		m_pRenderder->AddVolume(volume);

		m_pRenderder->ResetCamera();
		m_pRenderder->GetActiveCamera()->Zoom(1.3);

		//interactor->SetRenderWindow(m_QVTKWidget->GetRenderWindow());

		//interactor->SetInteractorStyle(style);

		myQVTKWidget->GetRenderWindow()->Render();

我们先把里面的与interactor有关的交互器屏蔽掉。现在就能看到效果了:

这里面有它自己带的交互效果,我们现在尝试一下使用QT和VTKWidget进行交互。

在类声明里加入私有变量:

vtkEventQtSlotConnect* myQtVtkConnections;

以及私有槽函数:

void currentMousePosition(vtkObject* obj);

之后在构造函数中定义:

myQtVtkConnections = vtkEventQtSlotConnect::New();
	myQtVtkConnections->Connect(myQVTKWidget->GetRenderWindow()->GetInteractor(),
		vtkCommand::MouseMoveEvent,
		this, SLOT(currentMousePosition(vtkObject*)));

通过VTK里面的链接函数链接VTK的信号和QT的槽。

在类声明中加入:

QStatusBar *myStatusBar;

构造函数中:

	myStatusBar = new QStatusBar(this);
	setStatusBar(myStatusBar);

然后就是事件函数:

void MyMainWindow::currentMousePosition(vtkObject * obj)
{
	// 获取交互器
	vtkRenderWindowInteractor* iren = vtkRenderWindowInteractor::SafeDownCast(obj);

	// 获取鼠标的当前位置
	int eventPos[2];
	iren->GetEventPosition(eventPos);

	QString str;
	myStatusBar->showMessage("x = "+QString::number(eventPos[0])+ " y = " + QString::number(eventPos[1]));

}

获取场景的交互器,然后找到当前的鼠标点,并在状态栏上进行显示。

效果如下:(气死我了,移植代码的时候不知道怎么定义了两个状态栏,结果一直各种错误,调了一个小时才发现问题。大家如果也有报错什么访问冲突,估计也是给同一个菜单定义了多个状态栏

现在,表面上的控件都搞完了,下节我们开始定义传输函数QDockWidget . 

相关文章:

  • QT传输函数控件设计6 设计Dock窗体结构
  • QT传输函数控件设计7 边界和布局规划
  • QT传输函数控件设计8 设计小圆点
  • QT传输函数控件设计9 初步设计视口类
  • QT传输函数控件设计10 包含小圆点的图形项
  • QT传输函数控件设计11 包含小圆点的图形项2
  • QT传输函数控件设计12 自定义信号和槽
  • QT传输函数控件设计13 大结局
  • QT三维图形1
  • QT三维图形2
  • QT三维图形3
  • QT三维图形4
  • icache的方面以及使用
  • cmp bne 以及sub指令的详解
  • 关于ARM Cortex a 系列的看门狗定时器
  • 2018一半小结一波
  • CentOS从零开始部署Nodejs项目
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript设计模式之工厂模式
  • Webpack 4x 之路 ( 四 )
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 当SetTimeout遇到了字符串
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 复习Javascript专题(四):js中的深浅拷贝
  • 利用DataURL技术在网页上显示图片
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 人脸识别最新开发经验demo
  • 入门级的git使用指北
  • 三栏布局总结
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • linux 淘宝开源监控工具tsar
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #QT(一种朴素的计算器实现方法)
  • #QT项目实战(天气预报)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (02)Hive SQL编译成MapReduce任务的过程
  • (6)添加vue-cookie
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (补)B+树一些思想
  • (二)springcloud实战之config配置中心
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)RocketMQ初步认识
  • (转)nsfocus-绿盟科技笔试题目
  • .java 9 找不到符号_java找不到符号
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖