这是一个QVTKWidget的子类,用于动态创建窗口,来显示dicom图像
imageWidget::imageWidget(QVTKWidget *parent)
: QVTKWidget(parent)
{
//setAcceptDrops(true);
//this->setStyleSheet("background-color: rgb(255,0,0);");
//QTime t;
//t.start();//将此时间设置为当前时间
//itk读取图像
typedef itk::Image<short,3> ItkImageType; //图像类型 ImageType
typedef itk::ImageFileReader<ItkImageType> ItkImgReaderType; //用户读
typedef itk::ImageToVTKImageFilter<ItkImageType> ItkToVtkFilterType;//链接ITK和VTK的类
ItkImgReaderType::Pointer itkImgReader = ItkImgReaderType::New();
ItkToVtkFilterType::Pointer itkTovtkImageFilter = ItkToVtkFilterType::New();
itk::GDCMImageIO::Pointer itkDicomIO = itk::GDCMImageIO::New();
char *dcmFileName = "data\\1.3.46.670589.33.1.63682629987876745200001.5330259530840410603.dcm";
itkImgReader->SetImageIO(itkDicomIO); //之后可以用itkDicomIO获取读到的DICOM数据中的各字段信息,关联GDCMImageIO类后,DICOM数据信息就读入内存,ITK能获取更加全面的信息(比起VTK)
itkImgReader->SetFileName(dcmFileName); //读取dcm文件,内部是通过GDCMImageIO读取的,所以一定要设置这个。
itkImgReader->Update(); //开始读取数据
itkTovtkImageFilter->SetInput(itkImgReader->GetOutput()); //设置图像数据从ITK转向VTK
itkTovtkImageFilter->Update(); //开始转换,将ITK读取的图像数据转换成vtkImageData并传给VTK的渲染模块:
//------------------------------itk读取完成--------------------------------
//图像翻转
vtkImageFlip* vtkImageflip = vtkImageFlip::New();
vtkImageflip->SetInputData(itkTovtkImageFilter->GetOutput());
vtkImageflip->SetFilteredAxis(1);
vtkImageflip->Update(); //不加这句会出现数据错误
vtkSmartPointer<vtkImageViewer2> viewer =
vtkSmartPointer<vtkImageViewer2>::New();
viewer->SetGlobalWarningDisplay(false);
//viewer->SetInputConnection(vtkImageflip->GetOutputPort());
vtkImageData *data = vtkImageflip->GetOutput();
viewer->SetInputData(data);
viewer->GetRenderer()->SetBackground(1,1,1);
//------------------都是可以的-----------------------
//viewer->SetRenderWindow(widget.GetRenderWindow()); //设置渲染窗口
//默认的切片方向是XY方向,为2.三维系数是怎么得来的。
this->SetRenderWindow(viewer->GetRenderWindow()); //设置渲染窗口
//viewer->SetRenderWindow(this->GetRenderWindow()); //
//----------------------------------------------------
//vtkSmartPointer<vtkRenderWindowInteractor> imgInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
//defInteractorStyle = vtkSmartPointer<DefinedInteractorStyle>::New();
//imgInteractor->SetInteractorStyle(defInteractorStyle);
//imgPicker = vtkSmartPointer<vtkCellPicker>::New();
//imgInteractor->SetPicker(imgPicker);
viewer->GetRenderer()->ResetCamera();
//viewer->GetRenderer()->GetActiveCamera()->SetParallelScale(255.5);
//widget.GetRenderWindow()->Render();
//widget.GetRenderWindow()->SetInteractor(viewer->GetRenderWindow()->GetInteractor());
//vtkSmartPointer<vtkRenderWindowInteractor> imgInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
//vtkSmartPointer<DefinedInteractorStyle> defInteractorStyle = vtkSmartPointer<DefinedInteractorStyle>::New();
//imgInteractor->SetInteractorStyle(defInteractorStyle);
//vtkSmartPointer<vtkCellPicker> imgPicker = vtkSmartPointer<vtkCellPicker>::New();
//imgInteractor->SetPicker(imgPicker);
//viewer->SetupInteractor(this->GetRenderWindow()->GetInteractor()); //设置自定义交互,这样设置就不行
this->GetRenderWindow()->SetInteractor(viewer->GetRenderWindow()->GetInteractor()); //设置为viewer的交互
//this->GetRenderWindow()->SetInteractor(viewer->GetRenderWindow()->GetInteractor());
//VtkEventQtSlot *eve = new VtkEventQtSlot(this);
//viewer->SetColorLevel(138.5);
//viewer->SetColorWindow(233);
//this->GetRenderWindow()->Render(); //这样也能渲染出来,但是相机不对
//qDebug()<<QString::fromLocal8Bit("整条渲染管线的时间:")<<t.elapsed()<<"ms";
//viewer->Render(); //最后再渲染,函数里面调用了重置相机和渲染窗口进行render。
}
当在qt界面利用gridLayout在界面上创建4*4,3*3的切分窗口的时候,由于vtk渲染管线的耗时特别长,导致界面产生到图像渲染出来特别不流畅,影响体验,暂时不知道什么原因,谁要是知道,麻烦指导下,不胜感激!