QVTKWidget控件一般顯示二維圖片,如果要顯示三維圖片,並通過鼠標滾輪切換單張圖片,則需要加入監聽機制,可以自定義一個類來實現所需要的交互方式,該類可以繼承於vtkCommand類。
(1)定義鼠標滾輪交互方式,用於顯示下一張切片
class vtkNextSliceCallbk : public vtkCommand
{
private:
vtkRenderWindowInteractor *Interactor;
vtkImageViewer2* viewer;
vtkInteractorStyleImage* style;
public:
static vtkNextSliceCallbk *New()
{
return new vtkNextSliceCallbk;
}
vtkNextSliceCallbk()//構造函數
{
this->Interactor = 0;
}
void SetInteractorStyle(vtkInteractorStyleImage* style)
{
this->style = style;
}
void SetInteractor(vtkRenderWindowInteractor *interactor)
{
this->Interactor = interactor;
}
vtkRenderWindowInteractor *GetInteractor()
{
return this->Interactor;
}
void SetViewer(vtkImageViewer2* viewer)
{
this->viewer = viewer;
}
virtual void Execute(vtkObject *caller, unsigned long eventId, void *callData)
{
int max = viewer->GetSliceMax();//獲得最大切片數目,避免翻頁超出範圍//63,從0開始
int cur = viewer->GetSlice();//獲得當前切片
if (eventId == vtkCommand::MouseWheelForwardEvent && cur >= 0)//向前翻頁
{
if(cur == 0)//切換到第一張,滾輪繼續向前,保持顯示第一張切片
viewer->SetSlice(0);
else
viewer->SetSlice(--cur);
viewer->SetSliceOrientationToXY();
Interactor->SetInteractorStyle((vtkInteractorObserver *)style);
}
if (eventId == vtkCommand::MouseWheelBackwardEvent && cur <= max)//向後翻頁
{
if(cur == max)//切換到最後一張,滾輪繼續向後,保持顯示最後一張切片
viewer->SetSlice(max);
else
viewer->SetSlice(++cur);
viewer->SetSliceOrientationToXY();
Interactor->SetInteractorStyle((vtkInteractorObserver *)style);
}
}
};
(2) 讀入MHD三維醫學圖片,通過滾輪切換單張圖片,源碼如下:
mhdReader = vtkMetaImageReader::New();
mhdReader->SetFileName(inputFileName);
mhdReader->Update();
//統計最大最小灰度值 (或者數據類型),自適應設置窗寬&窗位
//當灰度值高於該範圍的最大值時,均以白影顯示;而低於該範圍時均顯示爲黑色
dataType = mhdReader->GetDataScalarType();//獲得數據類型
imgSize = mhdReader->GetOutput()->GetExtent();//顯示圖像尺寸
rotate = vtkImageFlip::New();//圖像反轉
rotate->SetInputConnection(mhdReader->GetOutputPort());
rotate->SetFilteredAxis(1);//y軸反轉
originalVtkViewer->SetInputConnection(rotate->GetOutputPort());
//交互
renWinInteractor = vtkRenderWindowInteractor::New();
originalVtkViewer->SetRenderer(originalRenderder);//設置爲同一個渲染場景
originalVtkViewer->SetRenderWindow(ui->originalQVTKViewer->GetRenderWindow());
pCall = vtkNextSliceCallbk::New();//實例化自定義類
style = vtkInteractorStyleImage::New();
style->AddObserver(vtkCommand::MouseWheelBackwardEvent, pCall);
style->AddObserver(vtkCommand::MouseWheelForwardEvent, pCall);
renWinInteractor->SetInteractorStyle(style);
renWinInteractor->AddObserver(vtkCommand::MouseWheelBackwardEvent, pCall);//通過交互窗口去監聽
renWinInteractor->AddObserver(vtkCommand::MouseWheelForwardEvent, pCall);
pCall->SetInteractorStyle(style);
pCall->SetViewer(originalVtkViewer);
pCall->SetInteractor(renWinInteractor);
ui->originalQVTKViewer->GetRenderWindow()->SetInteractor(renWinInteractor);
originalVtkViewer->SetupInteractor(ui->originalQVTKViewer->GetRenderWindow()->GetInteractor());//設置交互方式
originalVtkViewer->SetSliceOrientationToXY();//設置切片方向
originalVtkViewer->SetColorLevel(128);//窗位
originalVtkViewer->SetColorWindow(256);//窗寬
QVTKWidget控件顯示三維圖片效果如下: