自用 QT5.15.2 VTK9.2.6 VS2022 显示Dicom图片
前置
QT ui中设置widget,objectName设置为 qvtkwidget
右键Ui部件,提升为,输入名称QVTKOpenGLNativeWidget,会自动填入头文件qvtkopenglnativewidget.h
在main函数文件中加入初始化(main入口前)
#include<vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
(用于初始化一些东西,加不加好像没什么变化,个人暂时未感觉出来)
显示Dicom图片
//设置Dicom文件路径
QString dicomFilePath = "Test.dcm";
//读取Dicom文件
vtkSmartPointer<vtkDICOMImageReader> reader = vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetDataByteOrderToLittleEndian();//设置小端对齐,看Dicom格式设置
reader->SetFileName(dicomFilePath.toStdString().c_str());//也可以读取文件夹,函数不同
reader->Update();
//新建渲染器,渲染窗口,Viewer2,交互器,交互器样式
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkImageViewer2> imageViewer = vtkSmartPointer<vtkImageViewer2>::New();
vtkNew<vtkGenericOpenGLRenderWindow> renderWindow ;
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
vtkSmartPointer<vtkInteractorStyleImage> interactorstyle = vtkSmartPointer<vtkInteractorStyleImage>::New();
//绑定操作
interactor->SetInteractorStyle(interactorstyle);
renderWindow->AddRenderer(renderer);//渲染窗口绑定渲染器
interactor->SetRenderWindow(renderWindow);//交互器绑定渲染窗口
ui.qvtkwidget->setRenderWindow(renderWindow.Get());//设置Ui部件的渲染窗口
//设置Viewer的渲染窗口,交互器
imageViewer->SetRenderWindow(renderWindow.Get());
imageViewer->SetInputConnection(reader->GetOutputPort());
imageViewer->SetColorLevel(ui.windowLevel->text().toDouble());//窗位,里面是一个ui部件,来获取值
imageViewer->SetColorWindow(500);//窗宽,也可以用值
imageViewer->Render();
//interactor->Disable();//禁止交互操作,要放在start(实际上是initialize)前,有时候只想看图
interactor->Initialize();
interactor->Start();//开始监听交互事件(如果未Initialize,则会自动Initialize)
总结
网上的QT VTK的教程好像都比较老,用了一些插件从而在ui界面创建一个vtk的特殊widget,现在这个东西没有了,直接用"提升为"就行了
QT的加入就是引入了一个ui部件,这个ui部件只需要给它一个对应的渲染窗口就行了,剩下的东西跟没有QT没有什么区别
值得注意的是,当渲染窗口绑定了渲染器,交互器绑定了渲染窗口后,只需要设置渲染窗口就可以关联到渲染器和交互器了,同时,要注意一下设置的顺序,有适合设置的前后顺序不同也可能出现问题
最后,显示的图片似乎比ui部件要小,还在寻找方法,但是已经可以显示了,启动交互器的话左键可以调整窗位,右键和滚轮可以放大缩小(已解决,但仍有问题)
vtkCamera* camera = imageViewer->GetRenderer()->GetActiveCamera();
double zoomFactor = 1.5;
camera->Zoom(zoomFactor);
设置imageViewer2的camera,给它一个缩放因子就行了,但是imageViewer2本身有进行一个自适应缩放,这个缩放因子不知道怎么算
个人学习用,如有错误,烦请告知,不胜感激!